如何使MySQL正确处理UTF-8

Ben*_*Ben 95 mysql utf-8

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

Owe*_*wen 83

更新:

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

要更改数据库:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)

看到:

原答案:

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.

如果您确实想要迁移现有数据,请记得先备份!当事情没有按计划进行时,会发生许多奇怪的数据问题!

一些资源:

  • 我的理解是,MySQL中的`utf8`仅指完整Unicode的一小部分.您应该使用`utf8mb4`来强制完全支持.请参阅http://mathiasbynens.be/notes/mysql-utf8mb4"很长一段时间,我使用MySQL的utf8字符集来表示数据库,表和列,*假设*它映射到上面描述的UTF-8编码." (29认同)
  • 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 (7认同)
  • @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认同)

Jav*_*ier 39

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

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Run Code Online (Sandbox Code Playgroud)

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

SHOW VARIABLES LIKE 'character_set%';
Run Code Online (Sandbox Code Playgroud)

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

  • 这是不正确的。MySQL 所谓的 `utf8` 不是“完整的”UTF-8。 (2认同)

T.W*_*ole 30

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

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

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

Ric*_*mes 19

简短回答:utf8mb4在4个地方使用:

  • 客户端中的字节是utf8,而不是latin1/cp1251/etc.
  • SET NAMES utf8mb4 或者在建立客户端与MySQL的连接时等效的东西
  • CHARACTER SET utf8mb4 在所有表/列上 - 除了严格为ascii/hex/country_code/zip_code/etc的列.
  • <meta charset charset=UTF-8>如果您输出到HTML.(是的拼写在这里不同.)

更多信息 ;
UTF8一路走来

上述链接提供了"解决所有问题需要详细的规范答案". - 这个论坛有一个空间限制.

编辑

除了CHARACTER SET utf8mb4包含"全部"世界的角色之外,COLLATION utf8mb4_unicode_520_ci还可以使用"最好的全能"整理.(对于那些希望使用这些语言的细微差别的人,还有土耳其语,西班牙语等.


ext*_*eon 5

字符集是数据库(默认)和表的属性。你可以看一下(MySQL命令):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

换句话说; 检查或更改数据库字符集非常容易:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8mb4; /* was: utf8 */
Run Code Online (Sandbox Code Playgroud)

  • 这是不正确的。MySQL 所说的“utf8”并不是“完整的”UTF-8。 (2认同)

归档时间:

查看次数:

213308 次

最近记录:

7 年,5 月 前