Mysql2 ::错误:字符串值不正确:'\ xE2 \ x80 \ xA8 \ x09

时间:2015-03-10 20:26:45

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

我有一个rails应用程序。有时,当用户在文本字段中写入并执行查询以更新MySQL数据库中的此字段时,我会收到此错误日志:

UPDATE boats SET description ='Vive laexperienciaúnicadenavegar abordo deunclásicodemadera de lujo como Mako。 Teemocionará。',updated_at ='2015-03-10 20:10:3​​2'WHERERE boats.id = 1

    E, [2015-03-10T20:10:32.223430 #20343] ERROR -- : Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09Te...' for column 'description' at row 1: UPDATE boats SET description = 'Vive la experiencia única de navegar abordo de un clásico de madera de lujo como Mako. 
        Te emocionará.', updated_at = '2015-03-10 20:10:32' WHERE boats.id = 1

注意:抱歉,我无法将上面的代码作为代码。必须有一个特殊的角色。

我希望用户可以添加任何字符而不会出错。

我有一个开发和生产环境。错误只发生在生产中。

我看到这篇文章看起来与我的问题相同:Mysql2::Error: Incorrect string value

我运行此查询show variables like 'char%';来检查数据库字符配置,并且: 开发:

'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/local/Cellar/mysql/5.6.19/share/mysql/charsets/'

生产:

'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'latin1'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/share/mysql/charsets/'

因此,我执行ALTER DATABASE yanpyprod CHARACTER SET utf8 COLLATE utf8_general_ci;将我的数据库字符集更新为utf8。

然而,在charecter set更改为utf8之后,我仍然会遇到同样的错误。

4 个答案:

答案 0 :(得分:43)

如果你运行ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8而不是查询上面数据库中更新的字符集,它就可以工作。

解决方案是最后一篇文章。

答案 1 :(得分:0)

有两种方法可以克服这个问题

  1. 更改
  2. 的默认字符集
  3. 更改特定字段的默认字符集

选项1
如公认的答案所示:

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8;

选项2
如果需要保留表的默认字符集,则可以修改出现问题的特定字段或字段集。

我在表中的两个字段上遇到了同样的问题,这些字段正在存储来自富文本字段值的内容。这些字段用于输入 HRML 以及引起错误的某些内容。

因此,如果问题仅在于一个字段或一组字段中,则可以设置该特定字段的字符集,则可以使用以下类型的ALTER查询来设置字段的字符集。

ALTER TABLE your_db_name.table_name MODIFY COLUMN column_name text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

注意:根据您的环境要求更新相关的名称和值。这里唯一需要强调的是CHARACTER SET utf8

答案 2 :(得分:0)

向ActiveRecord添加ORDER BY sd_id DESC LIMIT 1选项可以为我解决。

我还发现了这种变通方法,它迫使mysql将latin1视为utf-8: https://github.com/rails/rails/issues/9834#issuecomment-15210861

答案 3 :(得分:0)

我的问题是对于我的数据库连接,我使用的是 utf8mb4 字符集,但数据库表被设置为 latin1。一旦我匹配了这些,就没有问题了。

我认为您不必转换表,只需确保连接使用与数据库相同的字符集即可。