当前位置:  开发笔记 > 编程语言 > 正文

如何使MySQL正确处理UTF-8

如何解决《如何使MySQL正确处理UTF-8》经验,为你挑选了4个好方法。

其中一个答复的一个问题,我问昨天建议我要确保我的数据库能正确处理UTF-8字符.我怎么能用MySQL做到这一点?



1> Owen..:

更新:

简短的回答 - 你几乎应该总是使用utf8mb4charset和utf8mb4_unicode_cicollat​​ion.

要更改数据库:

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-setcharacter-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准备情况的文章(注意这些信息的一些已经过时)


我的理解是,MySQL中的`utf8`仅指完整Unicode的一小部分.您应该使用`utf8mb4`来强制完全支持.请参阅http://mathiasbynens.be/notes/mysql-utf8mb4"很长一段时间,我使用MySQL的utf8字符集来表示数据库,表和列,*假设*它映射到上面描述的UTF-8编码."
MySQL从未有过UTF-8的默认字符集.4.1和5.x直到最新的5.7都使用`latin1`和`latin1_swedish_ci`作为默认的字符集和校对.请参阅MySQL手册中的"服务器字符集和整理"页面以进行确认:https://dev.mysql.com/doc/refman/5.1/en/charset-server.html
@TimTisdall当大多数文本为ASCII时,您不必担心`utf8mb4`会占用额外的存储空间。尽管`char`字符串是预先分配的,但`varchar`字符串不是-参见[this document page]的最后几行(http://dev.mysql.com/doc/refman/5.5/en/charset-unicode- utf8mb4.html)。例如,`char(10)`将在utf8mb4下悲观地保留40个字节,但是`varchar(10)`将按照可变长度编码分配字节。

2> Javier..:

为了使这个'永久',在my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

要检查,请转到客户端并显示一些变量:

SHOW VARIABLES LIKE 'character_set%';

验证它们是否全部utf8,除了..._filesystem,哪些应该是,binary..._dir指向MySQL安装中的某个位置.



3> T.W.R. Cole..:

MySQL 4.1及更高版本有一个默认字符集,它调用utf8但实际上只是UTF-8的一个子集(只允许三字节字符和更小字符).

utf8mb4如果你想要"完整"的UTF-8,请用作你的字符集.


顺便说一句,我想暂停片刻,给MySQL团队一个非常好的,坚定的目光.o_o WTF你们在想什么?您是否意识到通过在程序中创建一个名为"utf8"的代码页而实际上是多少混乱,而该代码页实际上并不是UTF-8?该死的混蛋
绝对同意,这是唯一正确的答案.`utf8`不包括像表情符号这样的字符.`utf8mb4`的确如此.有关如何更新的更多信息,请查看此内容:https://mathiasbynens.be/notes/mysql-utf8mb4
可悲的是,到目前为止,这是唯一正确的答案.

4> Rick James..:

简短回答: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还可以使用"最好的全能"整理.(对于那些希望使用这些语言的细微差别的人,还有土耳其语,西班牙语等.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有