web-dev-qa-db-ja.com

MySQL utf8mb4、絵文字の保存時のエラー

MySQLデータベースのサービスのユーザーの名前を保存しようとしています。それらの名前には、????????????????のような絵文字を含めることができます。 (例のみ)

少し検索した後、これを見つけました stackoverflow これにリンク tutorial 。手順に従いましたが、すべてが正しく構成されているようです。

データベース(charsetと照合順序をutf8mb4(_unicode_ci)に設定)、TestTableというテーブル、およびこのように構成された「テキスト」列(VARCHAR(191)utf8mb4_unicode_ci)があります。

絵文字を保存しようとすると、エラーが発生します:

Example of error for shortcake (????):
    Warning: #1300 Invalid utf8 character string: 'F09F8D'
    Warning: #1366 Incorrect string value: '\xF0\x9F\x8D\xB0' for column 'Text' at row 1

適切に保存できた唯一の絵文字はSunSun️でした

すべてを正直にしようとしたわけではありませんが。

構成に不足しているものはありますか?

注意してください:保存のすべてのテストはクライアント側に関係しませんでした。 phpmyadminを使用して、値を手動で変更し、データを保存します。したがって、クライアント側の適切な構成は、サーバーが絵文字を適切に保存した後、afterを処理するものです。

Another Sidenote:現在、絵文字を保存するときに上記のようなエラーが発生するか、エラーが発生せず、Username ????のデータが保存されますUsername ????として。エラーの有無は、保存方法によって異なります。 SQLステートメントを使用して作成/保存するときは疑問符で保存し、インラインで編集するときは疑問符で保存し、編集ボタンを使用して編集するときはエラーが発生します。

ありがとうございました

EDIT 1:わかりましたので、解決策ではなく問題を発見したと思います。データベース固有の変数が適切に変更されなかったようです。

サーバーにrootとしてログインし、変数を読み取ります(グローバル):
使用クエリ:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

私のデータベース(phpmyadmin、同じクエリ)の場合、次のようになります。

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

特定のデータベースでこれらの設定を調整するにはどうすればよいですか?また、最初に表示された設定をデフォルトとして使用していても、新しいデータベースを作成すると、2番目の設定が設定として取得されます。

編集2:

これが私のmy.cnfファイルです:

[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld_safe]
socket=/var/run/mysqld/mysqld.sock

[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
log_error=/var/log/mysql/error.log
max_connections=200
max_user_connections=30
wait_timeout=30
interactive_timeout=50
long_query_time=5
innodb_file_per_table
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

!includedir /etc/mysql/conf.d/
67
Loki

character_set_client_connection、および_resultsは、そのショートケーキが食べられるように、すべてutf8mb4でなければなりません。

どこかで、それらのサブセットを個別に設定しています。 my.cnfとphpmyadminの設定を調べましょう。3つすべてが設定されているわけではありません。

SET NAMES utf8mb4が実行されると、3つすべてが正しく設定されます。

太陽は3バイトしかないために輝いていました-E2 98 80; utf8は、Unicode文字の3バイトutf8エンコードに十分です。

79
Rick James

サービス/アプリケーションが、クライアントの文字セットに対して「utf8mb4」ではなく「utf8」で接続している可能性があります。それはクライアントアプリケーション次第です。

PHPアプリケーションについては、 http://php.net/manual/en/function.mysql-set-charset.php または http:// php。 net/manual/en/mysqli.set-charset.php

Pythonアプリケーションについては、 https://github.com/PyMySQL/PyMySQL#example または http://docs.sqlalchemy.org/en/latest/を参照してください。 dialects/mysql.html#mysql-unicode

また、列が本当にutf8mb4であることを確認してください。直接的な方法の1つは次のとおりです。

mysql> SELECT character_set_name FROM information_schema.`COLUMNS`  WHERE table_name = "user"   AND column_name = "displayname";
+--------------------+
| character_set_name |
+--------------------+
| utf8mb4            |
+--------------------+
1 row in set (0.00 sec)
7
Pierce

私にとって、問題はmysqlクライアントにあることが判明しました。

mysqlクライアントはサーバー上のmy.cnfのc​​har設定を更新し、意図しない文字設定になりました。

それで、私がする必要があるのは、character-set-client-handshake = FALSEを追加することだけです。クライアント設定が文字設定を乱すことを無効にします。

my.cnfは次のようになります。

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
...

それが役に立てば幸い。

5
user3624198

ALTER TABLE table_name CHANGE column_namecolumn_name VARCHAR(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

クエリの例:

ALTER TABLE `reactions` CHANGE `emoji` `emoji` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

enter image description here

その後、絵文字をテーブルに保存できました:

enter image description here

0
Saurabh Mistry