我无法在表单中保存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标记。
答案 0 :(得分:2)
(令人惊讶地)有四个地方需要设置UTF-8编码以确保您的数据以mysql中的格式保存(为什么他们不使用utf-8,因为默认值超出我的范围):连接,数据库,表和列。在database.yml中指定utf-8负责连接,其他三个必须在mysql中设置(使用caracter set,collate和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发送。如果
,就会发生这种情况在这种情况下,浏览器可能会将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。