1. ホーム
  2. mysql

[解決済み] MySQL utf8mb4, 絵文字の保存時のエラー

2023-05-12 04:39:44

質問

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

少し検索した後、私はこれを見つけました スタックオーバーフロー にリンクしている チュートリアル . 手順に従い、すべてが適切に設定されているように見えます。

データベース (charset と collation は utf8mb4 (_unicode_ci) に設定)、TestTable というテーブル、および "Text" 列があり、このように設定されています (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

ちゃんと保存できた絵文字は、太陽☀️だけでした。

正直、全部は試していませんが。

何か設定に抜けがあるのでしょうか?

ご注意ください。 保存のすべてのテストは、クライアント側を関与させませんでした。私は phpmyadmin を使用して手動で値を変更し、データを保存しています。ですから、クライアント側の適切な構成は、私が世話をするものです。 の後、サーバーが適切に絵文字を保存するようにします。

もう一つの補足 : 現在、絵文字を保存する際に、上記のようなエラーが発生するか、エラーが発生せずに 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)

私のDatabaseの場合(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/

どのように解決するのですか?

character_set_client , _connection そして _results はすべて utf8mb4 でないと食べられない。

何かが、どこかで、これらのサブセットを個別に設定しているのです。 my.cnf と phpmyadmin の設定をかき回してみてください。

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

たった3バイトなので、太陽が輝いた-。 E2 98 80 ; utf8 は Unicode 文字の 3 バイトの utf8 エンコーディングで十分です。