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;
参考:
你可以使用这样的迁移来将你的表转换为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 SET
和COLLATE
:
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