UTF-8を使用しようとしましたが、問題が発生しました。
私は非常に多くのことを試しました。ここに私が得た結果があります:
????
。ヨーロッパのテキストでも、Se?or
のSeñor
を取得しました。Señor
や新浪新闻
の場合は新浪新闻
などの奇妙な意味不明な(もじばけ?).Se
for Señor
。私は何を間違えていますか? codeを修正するにはどうすればよいですか? dataを回復できますか?
この問題は、このサイトの参加者や他の多くの人々を悩ませています。
CHARACTER SET
トラブルの5つの主なケースをリストしました。
ベストプラクティス
今後は、CHARACTER SET utf8mb4
とCOLLATION utf8mb4_unicode_520_ci
を使用するのが最適です。 (パイプラインにはUnicode照合の新しいバージョンがあります。)
utf8mb4
は、utf8
のスーパーセットであり、絵文字や一部の中国語で必要な4バイトのutf8コードを処理します。
MySQLの外部では、「UTF-8」はすべてのサイズのエンコーディングを指します。したがって、MySQLのutf8mb4
ではなくutf8
と事実上同じです。
以下では、これらのスペルと大文字を使用して、MySQLの内部と外部を区別しようとします。
あなたがすべきことの概要すべきことやる
<form accept-charset="UTF-8">
のように開始する必要があります。CHARACTER SET utf8mb4
と宣言します(SHOW CREATE TABLE
で確認します。)<meta charset=UTF-8>
HTMLの先頭コンピューター言語の詳細 (および以下のセクション)
データをテストする
ツールまたはSELECT
を使用してデータを表示することは信頼できません。そのようなクライアント、特にブラウザが多すぎると、誤ったエンコーディングを補正し、データベースが破損していても正しいテキストを表示しようとします。そのため、英語以外のテキストを含む表と列を選択して、
SELECT col, HEX(col) FROM tbl WHERE ...
正しく保存されたUTF-8のHEXは
20
4x
、5x
、6x
、または7x
Cxyy
でなければなりませんDxyy
Exyyzz
F0yyzzww
見られた問題の特定の原因と修正
切り捨てられたテキスト(Señor
のSe
):
ブラックダイヤモンドと疑問符(Se�or
for Señor
);次のいずれかの場合があります。
ケース1(元のバイトはnotUTF-8):
INSERT
およびSELECT
の接続(またはSET NAMES
)はutf8/utf8mb4ではありませんでした。これを修正してください。CHARACTER SET utf8
(またはutf8mb4)であることを確認します。ケース2(元のバイトがUTF-8):
SELECT
の接続(またはSET NAMES
)はutf8/utf8mb4ではありませんでした。これを修正してください。CHARACTER SET utf8
(またはutf8mb4)であることを確認します。黒いひし形は、ブラウザが<meta charset=UTF-8>
に設定されている場合にのみ発生します。
疑問符(黒い菱形ではなく通常のもの)(Se?or
for Señor
):
CHARACTER SET utf8
(またはutf8mb4)ではありません。これを修正してください。 (SHOW CREATE TABLE
を使用します。)Mojibake(Señor
for Señor
):(この説明はDouble Encodingにも適用されます、必ずしも表示されるわけではありません。)
INSERTing
およびSELECTing
テキストがutf8またはutf8mb4を指定する必要がある場合の接続。これを修正してください。CHARACTER SET utf8
(またはutf8mb4)として宣言する必要があります。これを修正してください。<meta charset=UTF-8>
で始まる必要があります。データは正しいように見えても正しくソートされない場合は、間違った照合を選択したか、ニーズに合った照合がないか、Double Encoding。
ダブルエンコーディングは、上記のSELECT .. HEX ..
を実行することで確認できます。
é should come back C3A9, but instead shows C383C2A9
The Emoji ???? should come back F09F91BD, but comes back C3B0C5B8E28098C2BD
つまり、ヘックスの長さは約2倍になります。これは、latin1(または何でも)からutf8に変換し、それらのバイトをlatin1であるかのように扱い、変換を繰り返すことにより発生します。たとえば、文字列がSeñor
であるかのようにソートするため、ソート(および比較)は正しく機能しません。
データの修正、可能な場合
TruncationおよびQuestion Marksの場合、データは失われます。
Mojibake/Double Encoding、...
Black Diamonds、...
(別の質問/回答でこれを続けなければなりません。)
サーバーの移行後、2つのプロジェクトで同様の問題が発生しました。多くのソリューションを検索して試した後、私はこれに出会いました:
mysqli_set_charset($con,"utf8");
この行を設定ファイルに追加すると、すべて正常に動作します!
Mysqliのこのソリューションを見つけました https://www.w3schools.com/PHP/func_mysqli_set_charset.asp HTMLクエリから挿入を解決しようとしていたとき
幸運を!
面白い質問にあなた自身の質問に答える方法:)
コードIDE言語をUTF8に設定します
データフォームを収集するWebページヘッダーに追加します。
MySQLテーブル定義が次のようになっていることを確認します。
CREATE TABLE your_table (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PDOを使用している場合は、確認してください
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8');
$dbL = new PDO($pdo, $user, $pass, $options);
上記の問題のある大規模なデータベースを既に取得している場合は、SIDUを試して正しい文字セットでエクスポートし、UTF8でインポートして戻すことができます。幸運を