Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09

Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09

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

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' 其中 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

注意:抱歉,我无法将上面的代码作为代码。必须有特殊字符。

我希望用户可以无误地添加任何字符。

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

我看到这个 post 看起来和我的问题一样: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。

但是将字符集改为utf8后,还是报同样的错误

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

解决方案是附件中的 post,在最后。

有两种方法可以解决这个问题

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

选项 1
如已接受的答案:

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8;

选项 2
如果您需要保留 table 的默认字符集,则可以修改有问题的特定字段或一组字段。

我在 table 中的两个字段中遇到了同样的问题,这些字段正在存储来自富文本字段值的内容。这些字段用于输入 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

向 ActiveRecord 添加 encoding: latin1 选项为我解决了这个问题。

我还发现了强制 mysql 将 latin1 视为 utf-8 的解决方法: https://github.com/rails/rails/issues/9834#issuecomment-15210861

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

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