Mysql2 ::错误:字符串值不正确

Trt*_*Trt 55 ruby mysql encoding ruby-on-rails

我有一个在生产模式下运行的rails应用程序,但是当用户试图保存记录时,突然出现了这个错误.

Mysql2::Error: Incorrect string value
Run Code Online (Sandbox Code Playgroud)

更多细节(来自生产日志):

Parameters: {"utf8"=>"â<9c><93>" ... 

Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k 

Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k 
Run Code Online (Sandbox Code Playgroud)

现在我看到了一些需要删除数据库并重新创建数据库的解决方案,但我不能这样做.

现在mysql显示了这个:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)
Run Code Online (Sandbox Code Playgroud)

有什么问题,如何更改它,以便我对任何字符都没有任何问题?

另外:这个问题可以用javascript解决吗?在发送之前转换它?

谢谢

Chu*_*Zhu 75

问题是由你的mysql服务器端的charset引起的.您可以手动配置:

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8
Run Code Online (Sandbox Code Playgroud)

或删除表并重新创建它:

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

引用:

/sf/answers/1294874731/

/sf/answers/1185425321/

UPDATE

第一个命令只影响指定的表,如果要更改数据库中的所有表,可以这样做

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

参考:

/sf/answers/428099381/

  • 运行ALTER DATABASE命令不会更改问题表的字符集.运行ALTER TABLE确实有效.我能够使用以下命令检查字符集名称.SELECT CCSA.character_set_name FROM information_schema .TABLES` T,information_schema .COLLATION_CHARACTER_SET_APPLICABILITY`CCSA WHERE CCSA.collat​​ion_name = T.table_collat​​ion AND T.table_schema ="your_databasename"AND T.table_name ="your_tablename"; 参考:http://stackoverflow.com/questions/1049728/how-do-i-see-what-c​​haracter-set-a-database-table-column-is-in-mysql (4认同)

Bes*_*esi 43

我设法通过以下博客文章存储表情符号(占用4个字节):

Rails 4,MySQL和Emoji(Mysql2::Error: Incorrect string value error.)

当你指定了charset时,你可能会认为你可以安全地将大多数utf8数据插入到mysql中utf-8.可悲的是,你错了.问题是当存储在VARCHAR列中时,utf8字符集占用3个字节.另一方面,表情符号字符占用4个字节.

解决方案分为两部分:

更改表和字段的编码:

ALTER TABLE `[table]` 
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY [column] VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Run Code Online (Sandbox Code Playgroud)

告诉mysql2适配器:

development:
  adapter: mysql2
  database: db
  username: 
  password:
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!

然后我不得不重启我的应用程序,它工作.请注意,有些emojis可以在没有此修复的情况下工作,而有些则不会:

  • ➡️做了
  • 在我应用上述修复之前没有工作.

  • 为什么在“database.yml”中将排序规则设置为“utf8mb4_unicode_ci”而不是“utf8mb4_bin”? (2认同)

mfa*_*kas 23

您可以使用这样的迁移将表转换为utf8:

class ConvertTablesToUtf8 < ActiveRecord::Migration
  def change_encoding(encoding,collation)
    connection = ActiveRecord::Base.connection
    tables = connection.tables
    dbname =connection.current_database
    execute <<-SQL
      ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation};
    SQL
    tables.each do |tablename|
      execute <<-SQL
        ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation};
      SQL
    end
  end

  def change
    reversible do |dir|
      dir.up do
        change_encoding('utf8','utf8_general_ci')
      end
      dir.down do
        change_encoding('latin1','latin1_swedish_ci')
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)