php - UTF8 与 Latin1

标签 php mysql utf-8

我试图理解 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/

相关文章:

javascript - jQuery DataTable 行详细信息给出 "data is undefined"

.net - vb.net - 将字符串编码为 UTF-8

php - 如何检查与多个日期时间范围的冲突

php - 从表中查找所有 NULL 值

mysql - 如果数据存在则更新数据库,否则一步插入 MySQL

mysql - 通过不同数据库更新列

mysql - 使用 Perl 将 utf8 保存和检索到 MySQL 的步骤

utf-8 - 为什么 UTF-8 会浪费这么多位?

php - 选择前 10 行 - Laravel Eloquent

java - 类型为 java.lang.String 的值 <br 无法转换为 JSONObject