ホームページ  >  記事  >  データベース  >  MySQLの文字化けの原因とUTF8のデータ形式の設定方法を紹介

MySQLの文字化けの原因とUTF8のデータ形式の設定方法を紹介

不言
不言転載
2019-03-27 10:05:312466ブラウズ

この記事の内容は、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: デフォルトの文字セットデータベース サーバー

MySQLの文字化けの原因とUTF8のデータ形式の設定方法を紹介文字セット変換プロセスは 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 の文字シーケンス名は命名規則に従います: 文字シーケンスに対応する文字セット名で始まり、_ci (大文字と小文字を区別しない)、_cs (大文字と小文字を区別する)、または _bin (エンコード値、バイナリによる比較を示します) で始まります。 ) 最後に。例: 文字シーケンス「utf8_general_ci」では、文字「a」と「A」は同等です;


したがって、文字シーケンスは文字セットとは異なり、データベースの等価性またはサイズ比較に使用されます。田畑。 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)


utf8 に対応する一般的な文字シーケンスは、utf8_unicode_ci/utf8_general_ci や utf8_bin などです。では、それらの違いは何でしょうか?


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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。