其中一个答复的一个问题,我问昨天建议我要确保我的数据库能正确处理UTF-8字符.我怎么能用MySQL做到这一点?
更新:
简短的回答 - 你几乎应该总是使用utf8mb4
charset和utf8mb4_unicode_ci
collation.
要更改数据库:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
看到:
Aaron对此答案的评论如何使MySQL正确处理UTF-8
utf8_general_ci和utf8_unicode_ci之间有什么区别?
转换指南:https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html
原答案:
MySQL 4.1及更高版本的默认字符集为UTF-8.您可以在验证这个my.cnf
文件,记得设置两个客户端和服务器(default-character-set
和character-set-server
).
如果您希望将现有数据转换为UTF-8,请转储数据库,然后将其作为UTF-8导回,并确保:
SET NAMES utf8
在查询/插入数据库之前使用
DEFAULT CHARSET=utf8
在创建新表时使用
此时,您的MySQL客户端和服务器应该是UTF-8(请参阅参考资料my.cnf
).记住你使用的任何语言(如PHP)也必须是UTF-8.某些版本的PHP将使用自己的MySQL客户端库,这些库可能不支持UTF-8.
如果您确实想要迁移现有数据,请记得先备份!当事情没有按计划进行时,会发生许多奇怪的数据问题!
一些资源:
完整的UTF-8迁移(cdbaby.com)
关于php函数的UTF-8准备情况的文章(注意这些信息的一些已经过时)
为了使这个'永久',在my.cnf
:
[client] default-character-set=utf8 [mysqld] character-set-server = utf8
要检查,请转到客户端并显示一些变量:
SHOW VARIABLES LIKE 'character_set%';
验证它们是否全部utf8
,除了..._filesystem
,哪些应该是,binary
并..._dir
指向MySQL安装中的某个位置.
MySQL 4.1及更高版本有一个默认字符集,它调用utf8
但实际上只是UTF-8的一个子集(只允许三字节字符和更小字符).
utf8mb4
如果你想要"完整"的UTF-8,请用作你的字符集.
简短回答:utf8mb4
在4个地方使用:
客户端中的字节是utf8,而不是latin1/cp1251/etc.
SET NAMES utf8mb4
或者在建立客户端与MySQL的连接时等效的东西
CHARACTER SET utf8mb4
在所有表/列上 - 除了严格为ascii/hex/country_code/zip_code/etc的列.
如果您输出到HTML.(是的拼写在这里不同.)
更多信息 ;
UTF8一路走来
上述链接提供了"解决所有问题需要详细的规范答案". - 这个论坛有一个空间限制.
编辑
除了CHARACTER SET utf8mb4
包含"全部"世界的角色之外,COLLATION utf8mb4_unicode_520_ci
还可以使用"最好的全能"整理.(对于那些希望使用这些语言的细微差别的人,还有土耳其语,西班牙语等.