Railsアプリケーションがあります。ユーザーがテキストフィールドに書き込み、クエリを実行してMySQLデータベースのこのフィールドを更新すると、次のエラーログが表示されることがあります。
UPDATEボートSET説明= 'Vive la experienciaúnicade navegar abordo de unclásicode madera de lujo como Mako。 Teemocionará。 '、updated_at =' 2015-03-10 20:10:32 'WHERE boats.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に変更された後も、同じエラーが発生します。
上記のデータベースで更新された文字セットに対してクエリを実行する代わりにALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8
を実行すると機能します。
解決策は、最後に添付されたポストです。
これを克服するには2つの方法があります
オプション1
受け入れられた回答のように:
ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8;
オプション2
テーブルのデフォルトの文字セットを維持する必要がある場合は、問題のある特定のフィールドまたはフィールドセットを変更できます。
テーブルの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
ActiveRecordにencoding: latin1
オプションを追加することで解決しました。
また、mysqlがlatin1をutf-8として扱うように強制するこの回避策を見つけました: https://github.com/Rails/rails/issues/9834#issuecomment-15210861