我在MySQL中遇到编码问题,我需要一些帮助来弄清楚发生了什么。
首先,一些参数。表的默认编码是utf8。但是,character_set_client,character_set_connection,collation_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?
非常感谢你们。
答案 0 :(得分:2)
你的问题有点令人困惑,所以我会用自己的例子来解释:
您连接到数据库而不发出SET NAMES
,因此连接设置为Latin-1。这意味着数据库期望您和它之间的任何通信都以Latin-1编码
您将字节C3A2
发送到数据库,您希望以UTF-8编码表示“â”。
期待Latin-1的数据库将其解释为字符“¢”(Latin-1编码中的C3
和A2
)。
数据库将在内部以表格设置的任何编码存储这两个字符。
以不同的方式连接到数据库,运行SET NAMES UTF-8
。数据库现在希望以UTF-8与您交谈
您查询存储在数据库中的数据,您收到以UTF-8编码为C382 C2A2
的字符“”,因为您告诉数据库存储字符“”和你现在通过UTF-8连接查询它们。
如果您使用Latin-1再次连接到数据库进行连接,数据库将为您提供以Latin-1编码的字符“”,即字节C3 A2
。如果您以前连接的客户端正在解释Latin-1中的客户端,您将看到字符“”。如果客户端将其解释为UTF-8,您将看到字符“â”。
基本上这些是可以解决问题的点:
希望有所帮助。