25

特定のテーブル/列にエンコーディングutf8mb4を使用する場合、mysql >= 5.5.3 はすべての可能な文字を完全にサポートすることを読みましたhttp://mathiasbynens.be/notes/mysql-utf8mb4

いい感じ。私だけが、php の mb_functions がそうではないことに気付きました! リストのどこにも見つかりません: http://php.net/manual/en/mbstring.supported-encodings.php

読んだだけでなく、テストもしました。

内部エンコーディングが UTF-8 に設定されている php スクリプトを使用して、mysql utf8mb4 テーブルにデータを追加しました。mb_internal_encoding("UTF-8");

そして、予想通り、文字は一度データベースに入ると乱雑に見えます.

php と mysql を同じエンコーディング (おそらく 4 バイトのエンコーディング) で話させながら、世界の言語を完全にサポートする方法を教えてください。

また、utf8mb4 が utf32 と異なるのはなぜですか?

4

4 に答える 4

38

MySQL のutf8エンコーディングは実際の UTF-8ではありません。これは UTF-8 に似たエンコーディングですが、UTF-8 がサポートするもののサブセットのみをサポートします。utf8mb4実際のUTF-8 です。この違いは、MySQLの内部実装の詳細です。どちらも PHP 側では UTF-8 のように見えます。utf8またはを使用utf8mb4しても、どちらの場合でも PHP は有効な UTF-8 を取得します。

確認する必要があるのは、PHP と MySQL 間の接続エンコーディングutf8mb4が に設定されていることです。に設定されている場合utf8、MySQL はすべての文字をサポートしません。mysql_set_charset()、PDO charsetDSN 接続パラメータ、または選択したデータベース API に適したその他の方法を使用して、この接続エンコーディングを設定します。


mb_internal_encoding$encodingすべてのmb_*関数が持つパラメーターのデフォルト値を設定するだけです。MySQL とは関係ありません。

UTF-8 と UTF-32 では、文字のエンコード方法が異なります。UTF-8 は、 1 文字に最小1 バイト、最大 4 バイトを使用します。UTF-32は、すべての文字に常に4 バイトを使用します。UTF-16 は、最小で 2 バイト、最大で 4 バイトを使用します。
可変長であるため、UTF-8 にはわずかなオーバーヘッドがあります。UTF-16 で 2 バイトにエンコードできる文字は、UTF-8 では 3 または 4 になる場合があります。一方、UTF-16 は2 バイト未満を使用することはありません。大量のアジアのテキストを保存している場合、UTF-16 は使用するストレージが少なくなる可能性があります。テキストの大部分が英語/ASCII である場合、UTF-8 はより少ないストレージを使用します。UTF-32 は常に最も多くのストレージを使用します。

于 2013-06-03T08:54:44.110 に答える
10

これは私が使用したものであり、ユーロ記号と json_encode の失敗の変換を使用して問題を解決しました。

PHP設定スクリプト(APIなど)

header('Content-Type: text/html; charset=utf-8');
ini_set("default_charset", "UTF-8");
mb_internal_encoding("UTF-8");
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "UTF-8");

mysql テーブル / または特定の列

utf8mb4

mysql PDO 接続

$dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';

(...あなたのつながり...)

クエリを実行する前に (必要ない場合があります):

$dbh->exec("set names utf8mb4");
于 2015-10-04T20:46:21.810 に答える
4
  • utf-32: これは、1 文字あたり 4 バイト固定を使用する文字エンコーディングです。
  • utf-8: これは、1 文字あたり最大 4 バイトを使用する文字エンコーディングですが、最も頻繁に使用される文字は 1、2、または 3 文字のみでコーディングされます。

MySQL の utf-8 は 3 文字を超える文字コードをサポートしていないため、実際には utf-8 である utf-8mb4 を追加しました。

于 2013-06-03T08:55:33.490 に答える
3

実際のクエリを実行する前に、mysql_query ('SET NAMES utf8mb4') を実行します。

また、mysql サーバーが utf8mb4 も使用するように構成されていることを確認してください。方法の詳細については、次の記事を参照してください: https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

于 2015-02-09T03:43:15.140 に答える