web-dev-qa-db-ja.com

Mysql2 :: Error:不正な文字列値: '\ xE2 \ x80 \ xA8 \ x09

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に変更された後も、同じエラーが発生します。

15
Rober

上記のデータベースで更新された文字セットに対してクエリを実行する代わりにALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8を実行すると機能します。

解決策は、最後に添付されたポストです。

50
Rober

これを克服するには2つの方法があります

  1. テーブルのデフォルトの文字セットを変更します
  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

0
Shantha Kumara

ActiveRecordにencoding: latin1オプションを追加することで解決しました。

また、mysqlがlatin1をutf-8として扱うように強制するこの回避策を見つけました: https://github.com/Rails/rails/issues/9834#issuecomment-15210861