【问题标题】:UTF8 versus Latin1UTF8 与 Latin1
【发布时间】:2016-03-12 12:52:09
【问题描述】:

我正在尝试了解 Latin1 和 UTF8 之间的区别,并且在大多数情况下我明白了,但是,在测试时我得到了一些奇怪的结果,并且可以使用一些帮助来澄清

我正在使用“é”(带有锐音的拉丁小写字母 E)进行测试,下面的链接显示了十六进制 c3a9

我建立了一个数据库并指定了utf8作为字符集,然后创建了一个以utf8作为字符集的表,并在将连接和客户端字符集设置为UTF8后插入了一条带有字符'é'的记录

当我从 test_table 中选择十六进制(字段)时,我得到:

十六进制(字段),字段 C3A9, é

这很好并且与我阅读的内容一致,但是,当我使用 latin1 字符集执行完全相同的操作时,我得到以下信息:

十六进制(字段),字段 C3A9, é

但如果我输入 char(x'E9') 这应该是 é 的单字节 Latin1 等效值,我设法使用“设置名称 UTF8”使其正确显示,但在设置与 Latin1 的连接和客户端

谁能澄清一下? - 在 UTF8 和 Latin1 中,Latin1 字符不应该是单字节(十六进制 E9)吗?还是我完全误解了这一切?

谢谢

【问题讨论】:

  • 你能发一个SHOW CREATE TABLE,这样我们就可以看到表格的字符集了。
  • 另外,您如何查看这些结果?如果我在选择 hex("é"); 时将终端设置为 ISO-8859-1;我得到E9。当它设置为 UTF-8 时,我得到 C3A9。
  • mysql> 显示创建表 test_latin\G ****************************** 1. 行 **** *********************** 表:test_latin 创建表:CREATE TABLE test_latin (a varchar(500) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET =latin1
  • 我一直在使用 Mysql Workbench,但我尝试使用终端并在 latin1 和 utf8 之间切换并查看您报告的内容

标签: php mysql utf-8


【解决方案1】:

latin1 编码只有 1 字节代码。

前 128 个代码(7 位)在 latin1 和 utf8 之间基本相同。

é 超过 128;它是 1 字节、8 位 latin1 hex 是 E9 (如您所见)。对于 utf8,它需要 2 个字节:C3A9。对于大多数亚洲字符,utf8 占用 3 个字节; latin1 不能代表那些字符。

MySQL 有令人困惑的命令SET NAMES utf8。这表明客户端的编码是utf8,并指示客户端和服务器之间的通信在读/写时在列的 CHARACTER SET和utf8之间进行转换。

如果你有SET NAMES latin1(旧的默认值),但客户端中的字节编码为utf8,那么你就是在“撒谎”,并且会发生各种令人讨厌的事情。但是没有直接的线索表明出了什么问题。

完全采用 utf8 的清单:

  • 客户端中的字节是 utf8 编码的
  • SET NAMES utf8(或连接 MySQL 时的等效参数)
  • CHARACTER SET utf8 列或表声明
  • <meta ... UTF-8> 在 html 中

【讨论】:

    【解决方案2】:

    在最近将一个网站通过 UTF-8 的响铃后,我认为这是在 UTF-8 编码的页面或终端内的 latin1 表中查看 UTF-8 数据的情况。

    如果您使用的是终端,您可以通过查看终端的字符编码设置来检查这一点(在 Ubuntu 中是终端 -> 设置字符编码)。如果您使用的是 PHPMyAdmin 之类的东西,请查看页面源代码并查找页面的字符集,或者打开 Firebug 并查看页面的响应标头,它应该显示“UTF-8”。

    如果您已插入数据并以 UTF-8 编码并进入 latin1 表,则数据仍将以 UTF-8 存储,仅当您开始查看该数据或以 UTF-8 检索该数据时不同的编码,你开始得到损坏的效果。

    我发现,当您使用字符编码时,确保所有内容都相同,这一点非常重要:页面必须有一个 UTF-8 字符集,数据库的上游必须是 UTF-8,数据库必须具有默认字符集和 UTF-8 存储。一旦你在混合中加入不同的字符集,一切都会变得疯狂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多