Rails本番モードで実行中のアプリケーションがありますが、ユーザーがレコードを保存しようとしたときに突然このエラーが発生しました。
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
データベースを削除して再作成する必要があるいくつかのソリューションを見ましたが、それはできません。
現在、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サーバー側の文字セットが原因です。次のように手動で構成できます。
ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8
または、テーブルを削除して、次のように再作成します。
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;
参照:
私はこれを ブログ投稿 に従って絵文字(4バイトを占める)を保存することができました。
Rails 4、MySQL、および絵文字(
Mysql2::Error: Incorrect string value error.
)文字セットが
utf-8
であることを指定した場合、ほとんどのutf8データをmysqlに安全に挿入できると考えるかもしれません。残念ながら、あなたは間違っているでしょう。問題は、utf8文字セットがVARCHAR列に格納されると バイト を占有することです。一方、絵文字は4バイトを占めます。ソリューションは2つの部分に分かれています。
テーブルとフィールドのエンコードを変更します。
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
これが誰かを助けることを願っています!
その後、アプリを再起動する必要があり、機能しました。一部の絵文字はこの修正なしで機能しますが、機能しないものもあります。
次のような移行を使用して、テーブルを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
絵文字を保存するには、次のものが必要です。
1)移行を作成します(@mfazekasに感謝)
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('utf8mb4','utf8mb4_bin')
end
dir.down do
change_encoding('latin1','latin1_swedish_ci')
end
end
end
end
2)Rails charsetをutf8mb4に変更します(@ selvamani-pに感謝)
production:
encoding: utf8mb4
参照:
変える必要がある CHARACTER SET
およびCOLLATE
は、すでに作成されたデータベースの場合:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
または、事前に設定されたパラメーターを使用してデータベースを作成する必要がありました。
CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
また、データベース構造を変更したくない場合は、問題のフィールドをシリアル化することで選択できます。
class MyModel < ActiveRecord::Base
serialize :content
attr_accessible :content, :title
end
データベースからデータを取得する際のエンコードの問題のようです。以下をdatabase.ymlファイルに追加してみてください
encoding: utf8
これで問題が解決することを願っています
ちょうどこれに出くわし、@ mfazekasの答えに感謝します。移行では2つの変更を行いました。1つはconnection.current_databaseからの削除に対応するため(少なくともRails 5)、およびMySQLを使用しない場合はSQLステートメントをスキップする機能です(まだ使用しています) SQLiteは開発中ですが、実行するには移行が必要です)。
class ConvertTablesToUtf8 < ActiveRecord::Migration[5.2]
def change_encoding(encoding,collation)
# Allow for different adapter in different environment
return unless ActiveRecord::Base.connection_config[:adapter] == "mysql"
tables = connection.tables
dbname = ActiveRecord::Base.connection_config[: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