如何使MySQL正确处理UTF-8

对昨天我问的一个问题的答复之一,建议我应该确保我的数据库可以正确处理UTF-8字符。 我怎样才能做到这一点与MySQL?

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)
  • 关于UTF-8准备php功能的文章 (注意这些信息有些已经过时)

为了使这个“永久”,在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的一个子集(只允许三字节字符和更小)。

如果你想要“完整的”UTF-8,请使用utf8mb4作为你的字符集。

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

  • 你客户端的字节是utf8,而不是latin1 / cp1251 / etc。
  • 在建立客户端与MySQL的连接时,将SET NAMES utf8mb4或类似的东西
  • CHARACTER SET utf8mb4在所有表/列上CHARACTER SET utf8mb4 – 除了严格ASCII /国家代码/国家代码/ zip_code /等的列。
  • 如果你输出到HTML, <meta charset charset=UTF-8> (是的拼写是不同的。)

更多信息 ;
UTF8一路

上述链接提供了“详细的规范答案,以解决所有的问题”。 – 这个论坛有空间限制。

编辑

除了CHARACTER SET utf8mb4包含“所有”世界的人物, COLLATION utf8mb4_unicode_520_ci是可争论的'最好的全面'整理使用。 (也有土耳其语,西班牙语等,为那些想要在这些语言细微差异的人。)

该字符集是数据库(默认)和表的属性。 你可以看看(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 

换一种说法; 检查数据库字符集或更改它是很容易的:

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

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

 ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

这是这个问题的重复如何将整个MySQL数据库字符集和归类转换为UTF-8?

这些关于MySQL和UTF-8的技巧可能会有所帮助。 不幸的是,它们并不构成一个完整的解决方案,只是常见的陷阱。

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

 [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在页面底部的第一个/唯一的用户评论。 他提到skip-character-set-client-handshake有一定的重要性。

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

您的答案是您可以通过MySql设置进行配置。 在我的答案中可能是某些事情不合时宜,但这也是对你的帮助。
如何配置Character SetCollation

对于使用默认MySQL字符集和归类( latin1, latin1_swedish_ci )存储数据的应用程序,不需要特殊的配置。 如果应用程序需要使用不同的字符集或排序规则进行数据存储,则可以通过多种方式配置字符集信息:

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

这里显示的示例为您的问题设置了utf8字符集,这里还设置了更多有用的排序规则( utf8_general_ci排序规则)。

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

  CREATE DATABASE new_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; 

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

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci 

在MySQL配置时指定字符设置

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

要查看适用于连接的字符集和整理系统变量的值,请使用以下语句:

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

这可能是冗长的答案,但有一切办法,你可以使用。 希望我的回答对你有帮助。 欲了解更多信息http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

SET NAMES UTF8

这是诀窍

将您的数据库连接设置为UTF8:

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

数据库连接到UTF-8

 $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()); 

能够找到解决方案。 请按照http://technoguider.com/2015/05/utf8-set-up-in-mysql/中的说明进行操作;

 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;