Rails,MySQL,Unicode数据和latin1表 - 从这里开始?

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连接?),以及有关如何继续的任何提示.

Ham*_*ite 3

很可能存储在表中的数据是有效的 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)