我试图理解Latin1和UTF8之间的区别,并且大多数情况下我得到它,但是,在测试时我得到一些奇怪的结果并且可以使用一些帮助澄清
我正在测试'é'(带有急性的拉丁文小写字母E),下面的链接显示了十六进制c3a9
我设置了一个数据库,并指定utf8作为字符集,然后创建一个以utf8作为字符集的表,并在将连接和客户端字符集设置为UTF8后插入一个带有字符'é'的记录
当我从test_table中选择hex(字段)字段时,我得到:
十六进制(字段),字段C3A9,é
这很好,与我读到的一致,但是,当我使用latin1字符集完全相同时,我得到以下内容:
十六进制(字段),字段C3A9,é
但是如果我输入char(x'E9'),它应该是é的单字节Latin1等价值我设法使用'set names UTF8'正确显示它但是在设置连接和客户端时它没有正确显示到Latin1
任何人都可以澄清吗? - 在UTF8和Latin1中,Latin1字符不应该是单字节(Hex E9)吗?还是我完全误解了一切?
谢谢
最近将网站通过 UTF-8 明智的铃声后,我认为这是在 UTF-8 编码页面或终端内的 latin1 表中查看 UTF-8 数据的情况。
如果您使用终端,您可以通过查看终端的字符编码设置来检查这一点(在 Ubuntu 中是终端 -> 设置字符编码)。如果您使用 PHPMyAdmin 之类的工具,查看页面源代码并查找页面的字符集,或者打开 Firebug 并查看页面的响应标头,它应该显示“UTF-8”。
如果您已插入数据并且它以 UTF-8 编码并且进入 latin1 表,那么数据仍将以 UTF-8 存储,只有当您开始查看该数据或以不同的编码检索该数据时,你开始得到损坏的效果。
我发现,当您使用字符编码时,您得到的所有内容都相同,这一点非常重要:页面必须具有 UTF-8 字符集,数据库的上游必须采用 UTF-8,数据库必须具有默认字符集和UTF-8存储。一旦你在混合中加入不同的字符集,一切都会变得疯狂。