解密MySQL编码

时间:2011-11-29 08:57:42

标签: mysql unicode encoding utf-8 internationalization

我在MySQL中遇到编码问题,我需要一些帮助来弄清楚发生了什么。

首先,一些参数。表的默认编码是utf8。但是,character_set_client,character_set_connection,collat​​ion_connection和character_set_server MySQL系统变量都是latin1。

我进入我的MySQL服务器,然后使用本地命令行客户端连接到本地服务器。我选择了记录/列和返回的字符串,假设该字符返回为A,这是正确的。 A由UTF-8中的十六进制表示为“C5 9F”。

然而,点击服务器的PHP应用程序将其解释为XY。在MySQL命令行客户端中,如果我发送命令“SET NAMES utf8”,它现在也将显示为XY。

如果我选择INTO OUTFILE并使用hexedit编辑文件,我会看到两个映射到X的十六进制字符,然后是两个映射到Y的十六进制字符。(“c3 85”表示X和“C5 B8”表示Y)。基本上,它取两个十六进制值并将它们显示为UTF8字符。

首先,看起来数据库确实存储的内容为UTF8,但错误的UTF8,对吗?它们是作为原始Unicode进行的,但不知何故,可能是因为系统变量,它没有被转换为UTF8?

其次,MySQL命令行客户端如何/为什么正确地将XY解释为A?

最后,为了成功解释MySQL命令行,是否有一个图表显示C3 85 C5 B8如何转换为A,或者XY转换为A?

非常感谢你们。

1 个答案:

答案 0 :(得分:2)

你的问题有点令人困惑,所以我会用自己的例子来解释:

您连接到数据库而不发出SET NAMES,因此连接设置为Latin-1。这意味着数据库期望您和它之间的任何通信都以Latin-1编码 您将字节C3A2发送到数据库,您希望以UTF-8编码表示“â”。
期待Latin-1的数据库将其解释为字符“¢”(Latin-1编码中的C3A2)。
数据库将在内部以表格设置的任何编码存储这两个字符。

以不同的方式连接到数据库,运行SET NAMES UTF-8。数据库现在希望以UTF-8与您交谈 您查询存储在数据库中的数据,您收到以UTF-8编码为C382 C2A2的字符“”,因为您告诉数据库存储字符“”和你现在通过UTF-8连接查询它们。

如果您使用Latin-1再次连接到数据库进行连接,数据库将为您提供以Latin-1编码的字符“”,即字节C3 A2。如果您以前连接的客户端正在解释Latin-1中的客户端,您将看到字符“”。如果客户端将其解释为UTF-8,您将看到字符“â”。

基本上这些是可以解决问题的点:

  • 数据库将以任何为连接设置的编码解释它接收的字节 字符,并转换这些字符的编码以匹配他们假设的表存储在
  • 数据库会在检索数据时将其存储的编码中的任何字符的编码转换为连接的编码
  • 客户端可能会或可能不会将从数据库接收的 bytes 解释为正确的字符以显示在屏幕上,尤其是命令行环境并不总是设置为正确显示UTF-8数据< / LI>

希望有所帮助。