2016-02-01 8 views
41

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

少し検索した後、私はこのtutorialにリンクするこのstackoverflowを見つけました。ステップをたどって、すべてが正しく設定されているように見えます。

このように構成されたTestTableというテーブル( "utf8mb4(_unicode_ci)に設定された文字セットと照合順序)と、このように構成された"テキスト "列(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を使用して値を手動で変更し、データを保存します。したがって、クライアント側の適切な設定は、の後に私がを世話してくれる何かです。サーバーがemojisを適切に保存しています。

別の追記:現在、私は上記のようなエラーを取得、またはエラーと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/ 
+1

これはphpmyadminの問題です。他のmysqlクライアントを試してみてください。 – jsxqf

+2

私はそれがphpmyadminの問題だとは思わない。 Edit1で見ることができるように、conf/default変数/パラメータとデータベース上のパラメータの間にいくつかの設定ミスがあると思います。新しいデータベースを作成する場合でも。 – Loki

+0

PMAの設定で '$ cfg [" DefaultCharset "]'とは何ですか? – miken32

答えて

37

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

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

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

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

+0

さて、これで私はもっと近づくと思います。ありがとうございました。私は自分の質問を編集し、my.cnfを追加しました。多分あなたはそこに何かを見ることができますか? – Loki

+1

接続には 'utf8mb4'が必要です。それができる場所が見つからない場合は、 'SET NAMES utf8mb4'を実行してください。 –

+0

これは何が間違っていたかについての素敵な説明です。しかし、さらにセッションとグローバル変数をチェックしなければなりませんでした。 PHPMyadminsの実現セッション変数は依然として間違っていて、管理ボードだけでエラーが発生していました。 – Loki

3

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

は、あなたの列が本当にutf8mb4であることを確認し、またhttps://github.com/PyMySQL/PyMySQL#exampleまたはhttp://docs.sqlalchemy.org/en/latest/dialects/mysql.html#mysql-unicode

を参照してくださいPythonアプリケーションのためにhttp://php.net/manual/en/function.mysql-set-charset.phpまたはhttp://php.net/manual/en/mysqli.set-charset.php

を参照してください。 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) 
4

私にとっては、問題はmysqlクライアントに嘘をつきました。

mysqlクライアントがサーバー上でmy.cnfのchar設定を更新し、意図しない文字設定が行われました。

だから、私がする必要があったのは、character-set-client-handshake = FALSEを追加することです。 クライアントの設定が自分のchar設定を妨げないようにします。

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

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

希望します。

関連する問題