【问题标题】:Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09Mysql2::Error: 不正确的字符串值:'\xE2\x80\xA8\x09
【发布时间】:2015-05-12 11:10:18
【问题描述】:

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

更新船 SET 描述 = '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' WHEREboats.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。

但是,将字符集更改为utf8后,我仍然收到同样的错误。

【问题讨论】:

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


    【解决方案1】:

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

    解决方案是附在最后的帖子。

    【讨论】:

    • @Jayr 感谢您使用您的投票特权提供反馈。没有这样做,而是在评论中使用语言滑倒不是。
    【解决方案2】:

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

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

    选项 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-04-23
          • 1970-01-01
          • 2012-12-11
          • 1970-01-01
          • 2018-11-04
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多