7

これはおそらく単純なことです。私は答えをオンラインで探していたことを誓いますが、見つかりませんでした。私の特定のケースは少し特殊なので、最終的にここで質問することにしました。

中国語のプログラムに使用している MySQL のテーブルがいくつかあります。フォントがあまりサポートされていないまれな漢字も含めて、考えられるすべての漢字をサポートできる必要があります。テーブル内のサンプル セルは次のようになります。

東菄鶇䍶倲涷蝀凍鯟崠埬䰤</p>

データベースで正しく機能させるために、エンコーディング/照合を utf8mb4 に設定する必要がありました。ここまでは順調ですね。残念ながら、同じ文字列を PHP に取り込むと、次のように出力されます。

東菄鶇䍶?倲??涷蝀凍鯟?崠埬?䰤</p>

どうすれば残りの疑問符を最終的に消し去り、本来あるべき Unicode グリフとして表示させることができますか? タグ内およびメタタグとしてUTF8エンコーディングを使用して、phpページ自体を取得しました。

なぜ彼らはお互いに通信できないのですか?私は何を間違っていますか?

4

2 に答える 2

15

テーブルを に設定していると思いますutf8mb4が、接続エンコーディングは に設定されていutf8ます。これも に設定する必要がutf8mb4あります。そうしないと、MySQL は格納されたutf8mb4データを に変換しますutf8。後者は「高度な」Unicode 文字をエンコードできません。(はい、それは MySQL の特異性です。)

生の MySQL 接続では、次のようになります。

SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;

PHP から MySQL に接続する方法 (mysql、mysqli、または PDO) に応じて、クライアントの最適な方法に適応させる必要があります。


本当に明確にするために(はい、mysql_簡単にするために拡張機能を使用します。自宅でそれをしないでください):

mysql_connect(...);
mysql_select_db(...);
mysql_set_charset('utf8mb4');     // adapt to your mysql connector of choice

$r = mysql_query('SELECT * FROM `my_table`');

var_dump(mysql_fetch_assoc($r));  // data will be UTF8 encoded
于 2012-10-23T14:03:36.930 に答える
3

@decezeの回答に追加するだけで、適切に構成されたMySQLサーバーをお勧めします(私にとっては、/etc/mysql/mysql.conf.d/mysqld.cnf. を使用していることを確認するための構成オプションは次のとおりです。utfmb4ただし、すべての MySQL 構成オプションを確認することをお勧めしますが、非常に最適ではないデフォルトが多数あるため、非常に困難です。

[client]

default-character-set           = utf8mb4

[mysql]

default_character_set           = utf8mb4

[mysqld]

init-connect                    = "SET NAMES utf8mb4"
character-set-client-handshake  = FALSE
character-set-server            = "utf8mb4"
collation-server                = "utf8mb4_unicode_ci"
autocommit                      = 1
block_encryption_mode           = "aes-256-cbc"

その最後のものは、デフォルトであるべきものです。また、init-connect毎回それを実行する必要がないことを扱います。コードをきれいに保ちます。今実行します:

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 |
+--------------------------+--------------------+

そして、あなたはすでにこれを行っているように見えますが、テーブルの作成時に明示的に定義しても害はありません:

CREATE TABLE `mysql_table` (
  `mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

これが誰かに役立つことを願っています。

于 2016-10-17T06:37:33.053 に答える