将Rails应用程序中的UTF8数据编码到Mysql的问题

时间:2009-08-13 14:47:53

标签: mysql ruby-on-rails ruby encoding utf-8

我无法在表单中保存UTF8数据并将其正确保存在mysql中。特别是,通过我的ruby应用程序,我发布了一个包含以下内容的表单:

Gerhard Tröster

我在我的终端中看到的是在数据库中更新为:

UPDATE `xxxx` SET 
   `updated_at` = '2009-08-13 14:22:33', 
   `description` = '<p><span style=\"font-size: 14px; line-height: normal; white-space: pre; \">Gerhard Tr?ster</span></p>' 
WHERE `id` = 1228

然而,当我从这张表中选择时,它说:

| description |
---------------
| Gerhard Tr | 

请注意,它只是在变音符号之后截断所有内容,即使插入内容似乎包含它(或类似的东西)。

我的database.yml编码设置为UTF8,我在HTML中也包含了相应的META标记。

5 个答案:

答案 0 :(得分:2)

(令人惊讶地)有四个地方需要设置UTF-8编码以确保您的数据以mysql中的格式保存(为什么他们不使用utf-8,因为默认值超出我的范围):连接,数据库,表和列。在database.yml中指定utf-8负责连接,其他三个必须在mysql中设置(使用caracter set,collat​​e和set names命令)。

为了更好的衡量,您可能还需要在您的html标题和您的环境中添加utf-8指令;确保它“全面”接受。

这里有一些有用的信息:http://word.wardosworld.com/?p=164

答案 1 :(得分:1)

db条目中的问号表示它未正确更新为utf8。您需要确保db表和列具有utf8排序规则,并且还要将连接设置为utf8。确保您可以使用mysql查询SET NAMES'UTF-8'。

(此外,我想知道你为什么要在你的数据库中存储所有这些标记?)

答案 2 :(得分:1)

这些问题是一些可能出现问题的症状。主要与Ruby无关。

1)您的表单将以与UTF-8不同的Accept-Charset发送。如果

,就会发生这种情况
  • 表单发送的页面本身不是UTF-8,通过元标记或HTTP标头(来自Latin-1页面的表单将是Latin-1)
  • 表单明确指定它是以UTF-8
  • 以外的方式发送的
  • 您正在使用Javascript发布数据而不是正确转发,或者您的用户

在这种情况下,浏览器可能会将Unicode降级为它可以发送的字符集。通常,表单的假定接受字符集是首先显示表单的页面的字符集。

2)您的MySQL服务器配置方式主动阻止您使用UTF-8进行数据存储,因此MySQL默默地将您的UTF降级为其他东西(比如说MySQL被强制在每个连接上执行SET NAMES SOME_CRAPPY_8BIT_CHARSET_OF_1990,服务器管理员。没有笑话 - 这发生在我身上一次)。阅读本文,解释如何以100%的确定性为UTF-8硬连线   http://www.fngtps.com/2007/02/ruby-and-mysql-encoding-flakiness

3)您正在查看的终端没有向您显示UTF-8并尝试将其重新编码为拉丁文或ASCII,删除无法显示的字符并将其替换为“?” (标准模式)。如果你使用$ KCODE设置在普通Ruby中“put”ü'“你看到了什么? 在特殊设置到位之前,Windows终端特别容易受到这种行为的影响。

4)你正在运行Ruby 1.9,它对Unicode的处理是一个特殊的事情

5)完全不太可能,但谁知道:你正在使用(或你的主机使用)一些蹩脚的代理解决方案,它会破坏你的字符集标题或重新编码发送的输入。 我可以在2和3下注,有50%的几率。

答案 3 :(得分:1)

虽然上面已经提到过:

encoding: utf8放在database.yml中为我解决了这个问题。

答案 4 :(得分:0)

为了使Ruby本身有点像Unicode,你需要这一行:

$ KCODE ='你'

我总是将此行放在config / environment.rb

您的数据库必须使用utf8排序规则创建,并且您必须在database.yml中将编码设置为UTF8。