この記事の内容は、MySQL の文字化けの原因と UTF8 のデータ形式の設定方法に関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
MySQL を使用する場合、結果が文字化けすることが非常に厄介です。この問題はエンコード形式をUTF8に設定することで解決できるので、今回はその理由と設定方法についてお話します。
MySQL の文字形式
文字セット
プログラミング言語では、中国語の文字化けを防ぐために、Unicode を使用して中国語の文字を処理します。 , ネットワーク帯域幅を削減し、ストレージ容量を節約するために、エンコードに UTF8 を使用します。 2 つの違いについて十分に理解していない学生は、「Unicode 文字セットと UTF8 エンコーディングの過去と現在」の記事を参照してください。
MySQLでも同様にこのような処理を行いますが、現在のデータベース設定のエンコード方式(文字セット)を確認することができます:
mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
テーブルは現在設定されている文字セットです。注意する必要のない値がいくつかあります:
character_set_filesystem | binary: ファイル システム上のストレージ形式、デフォルトはバイナリ (バイナリ) です。 utf8: システムのストレージ形式、デフォルトは utf8
character_sets_dir | /usr/local/mysql/share/charsets/: 使用できる文字セットのファイルパス
残りのパラメータは、文字化けの毎日の読み取りと書き込みに影響するパラメータです。
-character_set_client: クライアントがデータを要求するために使用する文字セット-character_set_connection: クライアントからデータを受信するために使用される文字セット
-character_set_database: デフォルトのデータベースの文字セット。デフォルトのデータベースがない場合は、character_set_server フィールドを使用します
-character_set_results: 結果セットの文字セット
-character_set_server: デフォルトの文字セットデータベース サーバー
文字セット変換プロセスは 3 つのステップに分かれています:
1. クライアントはデータベース データを要求し、送信されるデータはcharacter_set_client を使用します。文字セット
2. MySQL インスタンスは、クライアントから送信されたデータを受信した後、それをcharacter_set_connection 文字セット
に変換します。 3. 内部操作を実行するときに、データの文字セットを内部演算文字セット:
(1) 各データフィールドの文字セット設定値を使用
(2) 存在しない場合は、該当データのデフォルトの文字セット設定値を使用table
(3) 存在しない場合は、該当データベースのデフォルトの文字セット設定値を使用します
(4) 存在しない場合は、character_set_server を使用します 設定値
4. 内部演算文字セットから演算結果の値をcharacter_set_resultsに変換します
文字シーケンス
文字シーケンスについて話す前に、いくつかの基本的な知識を理解する必要があります。
文字 (Character) は、人間の言語における最小の表意文字を指します。たとえば、「A」、「B」など;
一連の文字を指定して、各文字に値を割り当て、その値を使用して対応する文字を表します。この値は文字のエンコーディング ( Encoding )。たとえば、値 0 を文字 'A' に割り当て、値 1 を文字 'B' に割り当てると、0 が文字 'A' のエンコードになります。最後に、これらすべての文字とエンコーディングのペアのセットが文字セット (文字セット) です。たとえば、指定された文字リストが {'A','B'} の場合、{'A'=>0, 'B'=>1} が文字セットです。文字照合は、同じ文字セット内の文字間の比較規則を指します。
文字シーケンスが決定された後、文字セット内で同等の文字が何か、および文字間の違いを定義できます。 . サイズの関係;
各文字シーケンスは 1 つの文字セットに一意に対応しますが、1 つの文字セットは複数の文字シーケンスに対応することができ、その 1 つがデフォルトの文字シーケンス (デフォルトの照合順序) になります。
したがって、文字シーケンスは文字セットとは異なり、データベースの等価性またはサイズ比較に使用されます。田畑。 MySQL インスタンスによって設定されている文字シーケンスを確認してみましょう:
mysql> show variables like 'collation%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set (0.00 sec)
1. _bin は大文字と小文字を区別してバイナリで保存および比較されます。バイナリコンテンツを保存する場合は
2 を使用してください。 utf8_general_ci: 校正速度は速いですが、精度がやや悪いので使用してください中国語、英語を使用する場合
3. utf8_unicode_ci: 精度は高いですが、校正速度が若干遅くなります ドイツ、フランス、ロシアなどの外国語を使用する場合は
を使用してください。詳細な違いについては、
Mysql のソート ルール utf8_unicode_ci と utf8_general_ci の違いの概要を参照してください。文字セットと文字順序を変更する
MySQL 接続時に文字化けが発生する場合、基本的には文字セット/順序の設定が統一されていないと判断できます。 MySQL のデフォルトの latin1 形式は中国語をサポートしていません。ここは中国なので、中国語とさまざまな言語を完全にサポートする utf8 形式を選択しました。そのため、注意が必要な文字セットと文字列をutf8形式に変更する必要があります。
絵文字の保存をサポートする utf8mb4 形式を選択することもできます
以上がMySQLの文字化けの原因とUTF8のデータ形式の設定方法を紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。