Mic*_*cah 8 mysql ruby-on-rails utf-8 character-encoding
我对这些细节并不是百分之百确定,所以我希望有人能把我拉直,但我会继续我的想法......
当我第一次设置我的数据库时,我甚至没有考虑使用系统的默认字符编码,而是latin1.我从没想过i18n/l10n.它只是没有发生在我身上.我刚刚接受了默认设置并继续使用它.
无论如何,我一直专门为Rails应用程序使用数据库,现在我们已经获得了几GB的数据,100,000行和许多国际用户.我注意到我们的许多外国用户正在插入似乎是Unicode /非latin1的数据.这是一个例子:
疯狂的Unicode东西怎么样?☢☠☭
database.yml的
这是我们的database.yml文件.
development:
adapter: mysql
database: XXX
username: YYY
password: ZZZ
host: localhost
encoding: utf8
Run Code Online (Sandbox Code Playgroud)
如您所见,我们将字符编码设置为utf8.但是,我们所有的表都有一个默认的字符集latin1.我很确定这一点.
更新仔细观察后,我们的生产database.yml没有指定编码,而我的本地副本指定了utf8.当我转储生产数据库并在本地导入时,这会导致问题.现在似乎导入工作正常,但Rails正在错误地读取它.
mysql CLI工具
当我通过mysql CLI工具查看数据时,它会正确显示所有Unicode字符.但是,'show create table'语句清楚地表明这些表是默认的charset latin1.这让我相信MySQL在某种程度上足够聪明,可以存储非latin1数据.
HTTP标头
我们的HTTP Content-Type标头设置为utf-8,如下所示:
Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
转换尝试
我在将表格转换为utf-8编码时玩了一点,但都没有成功.主要是我尝试转储数据库,运行iconv进行转换,然后使用设置为utf-8的表重新导入.MySQL没有错误,但所有的Unicode数据都是乱码.
该怎么办?
我有点担心做什么(如果有的话).我坚信不修复没有破坏的东西,但这种情况让我很担心.我们从来没有收到用户关于无法存储数据的任何投诉,而且一切似乎都运行正常.我只想知道到底发生了什么,转换的是谁/什么(MySQL?Ruby?Rails?MySQL连接?),以及有关如何继续的任何提示.
很可能存储在表中的数据是有效的 UTF-8,但 MySQL 认为它是 Latin-1(因为这是声明列的数据类型)。当然,它也是有效的 Latin-1,因为据我所知,任何任意字节序列都是有效的 Latin-1。
当您转换为 UTF-8 时,MySQL 会看到有效的 Latin-1 编码数据,并将其转换为等效的有效 UTF-8。这意味着您获得的数据是双 UTF-8 编码的,这就是它出现乱码的原因。
解决这个问题的方法是将列转换为二进制字符串,然后从那里转换为 UTF-8。当您执行此操作时,MySQL 不会转换该字符串(因为您通过一种格式转换它,即“将此字符串视为一系列 0 和 1”)。
ALTER TABLE MyTable
MODIFY MyColumn CHAR(100) CHARACTER SET binary,
MODIFY MyColumn CHAR(100) CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)