最近、絵文字と他の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/
ガイドしてください
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%」などの変数を表示; + ---------------------- + ----- --------------- + |変数名|値| + ---------------------- + ------------------- -+ | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_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"であるため、これは正常です。
character_set_client がutf8
に設定されている
まず、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>
次のいずれかを行う必要がある場合があります
Mysqlにログインした後にこれを実行します
mysql> set character_set_client = 'utf8mb4';
mysql> show variables like 'character_set_client';
これにより、クライアントのセッションが確実にutf8mb4
を使用するようになります
コマンドラインで文字セットを使用して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
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へのアップグレードに関する詳細 です。
これは私のために働いたものです。 MySQLワークベンチでテーブルインスペクターを開き、テーブルのデフォルトの文字セットを確認します。この問題がある場合は、おそらくlatin1です(私の場合でも、utf8ではありません)。私の場合、設定ファイルやその他すべてをいじりたくありません。
だから、私は簡単なことをしました! MySQLコマンドラインを開き、以下のコマンドalter table
を適用すると、MySQLを再起動することなく、即座に機能しました。
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
注:これにより、入力テーブル名と一致するすべてのスキーマのテーブルのデフォルトの文字セットが変更されます。したがって、1つのスキーマのテーブルのみをターゲットにする場合は、スキーマ名とテーブル名を使用できます。