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/
character_set_client
、_connection
、および_results
は、そのショートケーキが食べられるように、すべてutf8mb4
でなければなりません。
どこかで、それらのサブセットを個別に設定しています。 my.cnfとphpmyadminの設定を調べましょう。3つすべてが設定されているわけではありません。
SET NAMES utf8mb4
が実行されると、3つすべてが正しく設定されます。
太陽は3バイトしかないために輝いていました-E2 98 80
; utf8は、Unicode文字の3バイトutf8エンコードに十分です。
サービス/アプリケーションが、クライアントの文字セットに対して「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)
私にとって、問題はmysqlクライアントにあることが判明しました。
mysqlクライアントはサーバー上のmy.cnf
のchar設定を更新し、意図しない文字設定になりました。
それで、私がする必要があるのは、character-set-client-handshake = FALSE
を追加することだけです。クライアント設定が文字設定を乱すことを無効にします。
my.cnf
は次のようになります。
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
...
それが役に立てば幸い。