关于utf 8:如何让MySQL正确处理UTF-8

How to make MySQL handle UTF-8 properly

我昨天问的一个问题的一个回答建议我应该确保我的数据库能够正确处理UTF-8字符。如何使用MySQL?


更新:

简短的回答-您几乎应该总是使用utf8mb4字符集和utf8mb4_unicode_ci排序规则。

要更改数据库:

1
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

原始答案:

MySQL4.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就绪性的文章(请注意,其中一些信息已经过时了)


my.cnf中,要使这一点成为"永久性"的:

1
2
3
4
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

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

1
SHOW VARIABLES LIKE 'character_set%';

验证它们都是utf8,除了..._filesystem,应该是binary..._dir,这在mysql安装中有所体现。


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

如果需要"完整"的UTF-8,请使用utf8mb4作为字符集。


简而言之:在4个位置使用utf8mb4

  • 客户机中的字节是utf8,而不是latin1/cp1251/etc。
  • 当建立客户端与MySQL的连接时,SET NAMES utf8mb4或类似的东西
  • 所有表/列上的CHARACTER SET utf8mb4--除了严格使用ASCII/Hex/Country_code/Zip_code/等的列。
  • 如果输出到HTML,则返回。(是的,这里的拼写不同。)

更多信息;一路UTF8

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

编辑

除了包含"全"世界字符的CHARACTER SET utf8mb4外,COLLATION utf8mb4_unicode_520_ci也可以说是最好的全方位排序规则。(也有土耳其语、西班牙语等,供那些想要这些语言细微差别的人使用。)


字符集是数据库(默认)和表的属性。您可以查看(mysql命令):

1
2
3
4
5
6
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

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

1
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;


要将数据库本身的字符集编码更改为utf-8,请在mysql>提示符下键入以下命令。使用ALTER DATABASE。将dbname替换为数据库名称:

1
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

这是这个问题的副本,如何将整个MySQL数据库字符集和排序规则转换为UTF-8?


我遵循了Javier的解决方案,但在my.cnf中添加了一些不同的行:

1
2
3
4
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8

我在这里找到了这个想法:http://dev.mysql.com/doc/refman/5.0/en/charset-server.html,在页面底部的第一个/唯一的用户注释中。他提到跳过字符集客户机握手具有一定的重要性。


把你的database collation设为UTF-8。然后将table collation应用于数据库默认值。


这些关于mysql和utf-8的提示可能会有所帮助。不幸的是,它们并不构成一个完整的解决方案,只是常见的问题。


您的答案是可以通过MySQL设置进行配置。在我的回答中,可能有些事情是断章取义的,但这也知道对你有帮助。如何配置Character SetCollation

For applications that store data using the default MySQL character set
and collation (latin1, latin1_swedish_ci), no special configuration
should be needed. If applications require data storage using a
different character set or collation, you can configure character set
information several ways:

  • 为每个数据库指定字符设置。例如,应用程序使用一个数据库可能需要utf8,而使用使用另一个数据库可能需要sjis。
  • 在服务器启动时指定字符设置。这会导致服务器为所有不创建其他应用程序的应用程序使用给定的设置安排。
  • 如果构建MySQL,请在配置时指定字符设置来源。这将导致服务器使用所有应用程序,无需在服务器启动时指定它们。

这里给出的示例可以让您的问题设置utf8字符集,这里也可以设置排序规则以获得更多帮助(utf8_general_cicollation`)。

为每个数据库指定字符设置

1
2
3
  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

在服务器启动时指定字符设置

1
2
3
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

在mysql配置时指定字符设置

1
2
shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

要查看应用于连接的字符集和排序规则系统变量的值,请使用以下语句:

1
2
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

这可能是一个冗长的答案,但总有办法,你可以使用。希望我的回答对你有帮助。有关详细信息,请访问http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


到UTF-8的数据库连接

1
2
3
$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());


埃多克斯1〔5〕

这就是窍门


找到了解决方案。按照http://technoguider.com/2015/05/utf8-set-up-in-mysql中的规定运行以下命令/

1
2
3
4
5
6
SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect =SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;


将数据库连接设置为utf8:

1
2
3
4
  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }