Mysql2 ::错误:不正确的string值

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

Mysql2::Error: Incorrect string value 

更多细节(从生产日志):

 Parameters: {"utf8"=>"â<9c><93>" ... Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k Mysql2::Error: Incorrect string value: '\xC5\x99\xC3\xA1k 

现在我看到了一些需要删除数据库并重新创build的解决scheme,但是我不能这么做。

现在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) 

什么是错的,我怎么改变它,所以我没有任何字符的问题?

另外:这个问题是可以解决的JavaScript? 在发送之前将其转换?

谢谢

这个问题是由你的mysql服务器端的字符集引起的。 你可以像手动configuration:

 ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8 

或者删除表格并重新创build它:

 rake db:drop rake db:create rake db:migrate 

引用:

https://stackoverflow.com/a/18498210/2034097

https://stackoverflow.com/a/16934647/2034097

UPDATE

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

 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci; 

参考:

https://stackoverflow.com/a/6115705/2034097

你可以使用这样的迁移来将你的表转换为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 

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

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

你可能会认为你已经安全地将大部分utf8数据插入到mysql中,当你指定charset是utf-8 。 可悲的是,你会错的。 问题是,当存储在VARCHAR列中时,utf8字符集占用3个字节 。 表情符号字符,占用4个字节

解决scheme分为两部分:

更改您的表和字段的编码:

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

告诉关于它的mysql2适配器:

 development: adapter: mysql2 database: db username: password: encoding: utf8mb4 collation: utf8mb4_unicode_ci 

希望这可以帮助别人!

然后我不得不重新启动我的应用程序,它的工作。 请注意,有些表情符号会在没有此修复的情况下运行,而有些则不会:

  • Did️工作
  • until在应用上述修复之前没有工作。

需要更改已经创build的数据库的CHARACTER SETCOLLATE

 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

或者有必要创build一个预设参数的数据库:

 CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci; 

从数据库获取数据时,这似乎是一个编码问题。 尝试添加下面到您的database.yml文件

  encoding: utf8 

希望这可以解决你的问题

此外,如果您不想在数据库结构中进行更改,则可以select序列化相关字段。

 class MyModel < ActiveRecord::Base serialize :content attr_accessible :content, :title end