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