web-dev-qa-db-ja.com

MySQL 5.6でutf8mb4文字を挿入できない

最近、絵文字と他の4バイト文字をmysqlデータベースに挿入するときに問題が発生しました。mysqlバージョンが5.1で、utf8mb4をサポートしていないことがわかったため、utf8mb4をサポートするmysql 5.6にアップグレードし、照合でオプションを選択しました。 utf8mb4.selectを選択しますが、phpmyadminを介してテーブル行に直接挿入しようとすると、このエラーが発生し、このリンクも参照されます

       http://dba.stackexchange.com/questions/59126/set-value-of-character-set-client-to-utf8mb4


 1 row affected.
      Warning: #1366 Incorrect string value: '\xF0\x9F\x9A\x8A k...' for column 'rajulp' at row 1

私はグーグルで検索しましたが、これはデータベースがutf8mb4文字をサポートしていないためであり、インターネットのいくつかのチュートリアルに従ってmy.cnfファイルを更新し、mysqlサーバーとサーバーを再起動しました。

       https://mathiasbynens.be/notes/mysql-utf8mb4

私はほぼすべての可能な組み合わせを試しましたが、SQLでこれを入力すると、エボジといくつかの4バイト文字を挿入できないため、utf8として最大がスローされます。

 Punjab me 1Train???? k niche 100 ????Sardar aa gaye..

mysqlの以下のコマンドの出力

 SHOW VARIABLES LIKE 'char%'


  character_set_client  utf8
     character_set_connection   utf8
   character_set_database   utf8mb4
    character_set_filesystem    binary
    character_set_results   utf8
   character_set_server utf8mb4
  character_set_system  utf8
     character_sets_dir /usr/share/mysql/charsets/

ガイドしてください

2
user56656

MySQL 5.6.23のUbuntuインストールでも同じ問題が発生しました。

/etc/mysql/my.confを編集して、これらのエントリをこれらのセクションに追加する必要がありました。

 [client] 
 default-character-set = utf8mb4 
 
 [mysqld] 
 character-set-server = utf8mb4 
 
 [mysql] 
 default-character-set = utf8mb4 

次にrootとして実行:service mysql restart

私のWebサーバー接続とローカル(シェル)mysql接続の両方がutf8mb4で動作しました。

 INSERT INTO some_table_name 
(some_index_id、value_to_be_utf8mb4)
 VALUES(55、x'F09F9A8A '); 
 select * from some_table_name; 
 | some_index_id | value_to_be_utf8mb4 | 
 | 55 | ???? | 
 1行セット(0.00秒)

以下は、mysqlの新しいコマンドラインのインスタンス化からの抜粋です。

 mysql>「%coll%」などの変数を表示; 
 + ---------------------- + ----- --------------- + 
 |変数名|値| 
 + ---------------------- + ------------------- -+ 
 | collat​​ion_connection | utf8mb4_general_ci | 
 | collat​​ion_database | utf8mb4_general_ci | 
 | collat​​ion_server | utf8mb4_general_ci | 
 + ---------------------- + ------------------- -+ 
 mysql>「%char%」などの変数を表示; 
 + -------------------------- +- --------------------------- + 
 |変数名|値| 
 + -------------------------- + --------------- ------------- + 
 | character_set_client | utf8mb4 | 
 | character_set_connection | utf8mb4 | 
 | character_set_database | utf8mb4 | 
 | character_set_filesystem |バイナリ| 
 | character_set_results | utf8mb4 | 
 | character_set_server | utf8mb4 | 
 | character_set_system | utf8 | 
 | character_sets_dir |/usr/share/mysql/charsets/| 
 + -------------------------- + ------- --------------------- + 

最後に、mysql 5.x仕様によると、 "character_set_system"は常に "utf8"であるため、これは正常です。

4
Nick

character_set_clientutf8に設定されている

まず、utf8mb4が存在することを確認してください

mysql> select * from information_schema.character_sets where CHARACTER_SET_NAME like 'utf8%';
+--------------------+----------------------+---------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION   | MAXLEN |
+--------------------+----------------------+---------------+--------+
| utf8               | utf8_general_ci      | UTF-8 Unicode |      3 |
| utf8mb4            | utf8mb4_general_ci   | UTF-8 Unicode |      4 |
+--------------------+----------------------+---------------+--------+
2 rows in set (0.00 sec)

mysql>

次のいずれかを行う必要がある場合があります

提案#1

Mysqlにログインした後にこれを実行します

mysql> set character_set_client = 'utf8mb4';
mysql> show variables like 'character_set_client';

これにより、クライアントのセッションが確実にutf8mb4を使用するようになります

提案#2

コマンドラインで文字セットを使用してMySQLクライアントを起動します

これでテストして

mysql -uroot -p --default-character-set=utf8mb4 -ANe"show variables like 'character_set_client'"

エコーするか

+----------------------+---------+
| character_set_client | utf8mb4 |
+----------------------+---------+

または

mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

character_set_client が設定されている場合は、実行します

mysql -uroot -p --default-character-set=utf8mb4

試してみる !!!

2
RolandoMySQLDBA

Utf8mb4文字セットを必要とする一般的なUnicode文字は絵文字です。

Utf8mb3は、Basic Multilingual Plane(BMP)の文字のみをサポートします。 Utf8mb4はBMPおよび補助文字をサポートします。マルチバイト文字ごとに最大4バイトが必要です。これにより、全体的なデータストレージスペース要件が増加する可能性があります。

絵文字の格納に使用される列には、utf8mb4を使用することをお勧めします。 MySQL 5.7.xおよび8.0.xでパフォーマンスが大幅に改善されました。これは、MySQL8.0.x以降のデフォルトの文字セットです。

MySQLでは、4バイトのUnicodeデータを保持するためにutf8mb4文字セットを使用する必要があります。 utf8mb4文字セットを使用するようにスキーマを変更し、LOAD dataコマンドを変更してCHARACTER SET utf8mb4にする必要があります。

mysql> show global variables like’character%’;

現在の文字値を見て、それらをutf8mb4に変更します。

mysql> set global character_set_client='utf8mb4'
mysql> set global character_set_connection='utf8mb4';
mysql> set global character_set_database='utf8mb4';
mysql> set global character_set_results='utf8mb4';
mysql> set global character_set_server='utf8mb4';

注:これらの変更を永続的にするには、[client]セクションと[mysqld]セクションの両方のMySQL構成を更新する必要があります。

考えられる問題:

MySQLに絵文字を保存する際の一般的な問題

1)

エラーコード:1366。列の不正な文字列値: '\ xF0\x9F\x94\x8D'。

絵文字のサポートを必要とするテーブル/列を変更して、適切な文字と照合を使用します。

ALTER TABLE <tbl_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE collation_name;

各文字セットには1つ以上の照合順序がありますが、各照合順序は1つだけの文字セットに関連付けられています。したがって、データのニーズに基づいて文字セットに一致する特定の照合タイプについては、ドキュメントを参照してください。

例:

utf8mb4_unicode_ci;
utf8mb4_bin;

2)

エラー3140(22032):無効なJSONテキスト:「文字列に無効なエスケープ文字があります。」

JSONデータの読み込み中。

MySQLパーサーはデフォルトでエスケープコードを処理するため、JSONデータにエスケープが含まれている場合は、エスケープの処理を無効にする必要があります。

mysql> insert into test values ('{"MN1":"\\value", "MN2": 11}');
ERROR 3140 (22032): Invalid JSON text: "Invalid escape character in string." at position 8 in value for column 'test.json'.

この場合、NO_BACKSLASH_ESCAPES SQLモードを有効にして、パーサーがエスケープコードを処理せずに、JSONパーサーがそれらを処理できるようにする必要があります。

JSONをインポートするためにLOAD DATAを使用している場合は、コマンドにFIELDS ESCAPED BY ''を追加して、インポートファイルの解析時にエスケープシーケンス処理が無効になるようにする必要があります。

3)LOAD DATA INFILEはUTF8mb4文字列の受け入れに厳密であり、エラーをスローします

1300:「無効なutf8mb4文字列」

問題は、文字が間違った文字セットとして解釈されていることです。クライアント/サーバーの文字セットのハンドシェイクの問題。

文字列を挿入するとき、MySQLは元の文字セットを認識する必要があります。以下を使用して文字セットを指定できます。

名前の設定utf8mb4データファイルの読み込み...文字セットutf8mb4。

こちらが MySQL 5.6へのアップグレードに関する詳細 です。

2
awsdbaexpert

これは私のために働いたものです。 MySQLワークベンチでテーブルインスペクターを開き、テーブルのデフォルトの文字セットを確認します。この問題がある場合は、おそらくlatin1です(私の場合でも、utf8ではありません)。私の場合、設定ファイルやその他すべてをいじりたくありません。

だから、私は簡単なことをしました! MySQLコマンドラインを開き、以下のコマンドalter tableを適用すると、MySQLを再起動することなく、即座に機能しました。

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;

注:これにより、入力テーブル名と一致するすべてのスキーマのテーブルのデフォルトの文字セットが変更されます。したがって、1つのスキーマのテーブルのみをターゲットにする場合は、スキーマ名とテーブル名を使用できます。

0
pavani gayathri