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,在最后。
有两种方法可以解决这个问题
- 更改table
的默认字符集
- 更改特定字段的默认字符集
选项 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。一旦我匹配了这些,就没有问题了。
我认为您不必转换表,只需确保连接使用与数据库相同的字符集即可。
我有一个 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,在最后。
有两种方法可以解决这个问题
- 更改table 的默认字符集
- 更改特定字段的默认字符集
选项 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。一旦我匹配了这些,就没有问题了。
我认为您不必转换表,只需确保连接使用与数据库相同的字符集即可。