我试图理解 Latin1 和 UTF8 之间的区别,并且在大多数情况下我明白了,但是,在测试时我得到了一些奇怪的结果,需要一些帮助来澄清
我正在测试“é”(带有尖音符的拉丁文小写字母 E),下面的链接显示了十六进制 c3a9
我建立了一个数据库并指定了utf8作为字符集,然后在将连接和客户端字符集设置为UTF8之后创建了一个以utf8作为字符集的表并插入了一条包含字符'é'的记录
当我从 test_table 中选择十六进制(字段)字段时,我得到:
十六进制(字段),字段 C3A9, é
这很好并且与我阅读的内容一致,但是,当我使用 latin1 字符集执行完全相同的操作时,我得到以下信息:
十六进制(字段),字段 C3A9, é
但是如果我输入 char(x'E9'),它应该是 é 的单字节 Latin1 等效值,我设法使用“set names UTF8”使其正确显示,但是在设置Latin1 的连接和客户端
谁能解释一下? - 在 UTF8 和 Latin1 中,Latin1 字符不应该是单字节(十六进制 E9)吗?还是我完全误解了这一切?
谢谢
最佳答案
latin1 编码只有 1 字节代码。
前 128 个代码(7 位)在 latin1 和 utf8 之间大部分相同。
é
超出128;它是 1 字节,8 位 latin1 十六进制是 E9
(如您所见)。对于 utf8,它占用 2 个字节:C3A9
.对于大多数亚洲字符,utf8 占用 3 个字节; latin1 不能代表那些字符。
MySQL 有令人困惑的命令 SET NAMES utf8
.这宣布客户端编码为utf8,并指示客户端和服务器之间的通信在列 CHARACTER SET
之间进行转换。读/写时使用 utf8。
如果你有SET NAMES latin1
(旧的默认值),但客户端中的字节编码为 utf8,那么你就是在“撒谎”,并且会发生各种令人讨厌的事情。但是没有立即的线索表明出了什么问题。
完全使用 utf8 的 list :
- 客户端中的字节是utf8编码的
-
SET NAMES utf8
(或连接到 MySQL 期间的等效参数) -
CHARACTER SET utf8
在列或表声明上 -
<meta ... UTF-8>
在 HTML 中
关于php - UTF8 与 Latin1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34141710/