2009-08-13 64 views
0

我无法在表单中保存UTF8数据并正确保存在mysql中。特别是,通过我的Ruby应用程序,我发布包含以下内容的形式:从Rails应用程序编码UTF8数据到Mysql的问题

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标记。

+1

我不认为这是问题,但有一些有趣的事情引用转义。当您的值由单引号分隔时,您为什么要逃避双引号? – 2009-08-13 14:54:39

+0

嗯...似乎是从编辑 - 我想这个问题可能有点在约翰·拉希的编辑有点损伤。 – 2009-08-13 14:55:44

+0

@Dominic - 我只是编写了块,使其中的一切完好无损 – 2009-08-13 16:20:33

回答

1

数据库条目中的问号意味着它没有被正确更新为utf8。您需要确保数据库表和列具有utf8归类,并且您也将连接设置为utf8。确保您可以使用mysql查询SET NAMES'UTF-8'。

(而且我不知道为什么你存储在你的数据库中的所有这些标记?)

+0

谢谢。这个?我认为是我的终端,因为它显示了*发送给数据库的内容。数据库根本不包括问号后面的任何内容。 – 2009-08-13 15:38:04

+0

用于DB中标记的+1 - 我可以看到需要的唯一原因是当您将用户输入存储为富文本 – 2009-08-13 16:24:32

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

这些问题是有症状的一些可能出现的问题。大多数情况下与Ruby无关。

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

  • 的形式被发送该网页本身不是UTF-8,通过元标记或HTTP标头(从拉丁语1页形式将拉丁1)
  • 形式明确规定,它是作为比其他的东西送UTF-8
  • 您正在使用Javascript功能来发布的数据,并不能正确地逃避,或您的用户做

在这种情况下,浏览器可能被降级的Unicode到它可以发送的字符集。通常,表单中假定的接受字符集是首先显示表单的页面的字符集。 2)你的MySQL服务器的配置方式主动阻碍你使用UTF-8存储数据,所以MySQL默默地将你的UTF文件降级到其他的东西(比方说MySQL被强制在每个连接上执行SET NAMES SOME_CRAPPY_8BIT_CHARSET_OF_1990,由服务器管理员。没有笑话 - 这发生在我身上一次)。阅读这篇文章,其中介绍了如何硬连线家居UTF-8以100%的确定性 http://www.fngtps.com/2007/02/ruby-and-mysql-encoding-flakiness

3)你的终端,你所看到的是不是你展示UTF-8,并试图将其重新编码成拉丁文或ASCII下探它无法显示的字符并将其替换为“?” (标准模式)。如果你用“$ KCODE”在普通Ruby中“放置'ü'”,你会看到什么? 特殊设置到位之前,Windows终端特别容易受到这种行为的影响。

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

5)完全不可能的,但谁知道:你正在使用(或您的主机托管服务提供商正在使用),该轧液您的charset一些蹩脚的代理解决方案标题或重新编码发送的输入。 我可以赌2和3有50%的几率。

+0

谢谢。我在上面引用的同一个终端上试过这个: irb(main):001:0>“puts'ü'” =>“puts'\ 303 \ 274'” 因此它在输入在那里你可以看到输出。 – 2009-08-17 17:30:09

0

为了使自己的Ruby一点点支持Unicode的,你需要这个行:

$ KCODE = 'U'

我总是把此行到config/environment.rb

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

+0

很长一段时间,Rails默认使用UTF-8/Unicode。无需设置$ KCODE。 – molf 2009-08-27 10:13:12

1

虽然这是上面已经提到:

encoding: utf8在database.yml中解决了这个问题对我来说。