Mysql & 文字セットと照合順序の役割の理解

1. 文字セットとは何ですか?

文字セットについて説明する前に、コンピューターが人間の言語をどのように理解するか、つまり、これらの文字列をどのように理解するかについて考える必要があります。

コンピューターが認識できるのは 00110011... のバイナリ データの集まりだけであることは誰もが知っています。それはすべて文字セットに関するものです。
オブジェクトのキーと値のペアの関係を理解すると、文字セットを理解するのがはるかに簡単になります。次に例を示します。

'00100001': 'A'
'00100010': 'B'
...

ユーザーが文字 A を入力すると、対応するバイナリがマップされます。これは、字符集実際には一連の文字をバイナリにバインドする名詞です。

同様に、文字集合のマッピング規則もさまざまですが、例えば上記の場合、バイナリの 3 つの集合の形式で記述することもできます。

'000000010000000100000001': 'A'
'000000110000001100000011': 'B'
...

マッピング ルールの違いが違いを生む字符集种类. 初期の頃は、それが使用されていたASCII 字符集. 百科事典の助けを借りて、それらのマッピング関係を見てみましょう:
ここに画像の説明を挿入
文字セットの概念は既に理解されていると思います. ASCII 文字セットは英字と特殊記号のみをマップし、合計で 128 のマッピングしかありません. コンピュータの継続的な普及に伴い、世界中の国に独自の言語があり、すべて独自のマッピング セットが必要です。明らかに ASCII 文字セットは中国語には適していませんが、我が国には 5,000 年以上の言語と文学の歴史があるため、128 で十分であるとは言えません。世界中の言語を含めると、少なくとも 10 万はありますよね?

さまざまな国の言語が異なるため、独自の文字セットが開発されていますが、これにより矛盾が生じます. 世界のすべての国を統一するために、国際連合は一般的な文字セットのソリューションのセットを策定しました.業界標準でありUnicode、世界のほとんどの書記体系を体系化してエンコードしていますUnicodeが文字の処理は 2 バイトを使用してエンコード (マッピング) され、ASCII は英語のみを 1 バイトでエンコードするため、これは英語にとって非常に重要です.ストレージのオーバーヘッドは非常に高いので, 誰かがUnicode後でUTF標準に基づいて一連の文字セットを抽象化しました. 原理はいくつかのアルゴリズムUnicodeを介して, の一部でもuffありますUnicode. 最も広く使用されているのはutf-8その記憶特性は可变Unicodeその、動的に文字を格納するためにバイトを使用しますutf-8英語に遭遇すると、英語を1バイトエンコーディングとして扱います 中国語に遭遇すると、3バイトエンコーディングとして扱います、1~4ここから、中国語Unicodeutf-8が、uft-8文字セットは現在最も広く使用されています。

文字セットの詳細については割愛します. これは単なる予兆です. 文字セットの種類、歴史的なスキーム、文字エンコーディング規則などを学びたい場合は、興味のある学生は自分で学ぶことができます.

ここで、ファイルを開く際のいわゆる「文字化け」の問題を実装しましょう。
まず、次の内容のA.txtテキスト

你好

次に、保存時にエンコーディング タイプを選択しますANSI(以前は GBK23212)。エディタ
ここに画像の説明を挿入
で開きます。Subline Text
ここに画像の説明を挿入

你好になっていることがわかりますÄãºÃ。この問題の理由は、Subline Textデフォルトutf-8。[設定]Subline Textオプション
ここに画像の説明を挿入

また、私たちのものA.txtANSI文字セットのエンコーディングで保存されているので、アヒルと話している写真があります. この問題を解決するのも非常に簡単です.Subline Textデフォルトのます.効果を見てくださいANSIA.txtutf-8
ここに画像の説明を挿入

2.Mysql 文字セット

文字セットがわかれば、Mysql 文字セットを理解するのは簡単なことです.データベースを作成するとき、文字セット オプションがあります.このオプションは、実際には保存したファイルと同じです.どのエンコーディングを保存しますか? data in? ただし、Mysql には多くの種類の文字セットがあり、ここで最も一般的に使用されるものですが、Mysqlutf8は去勢します。たとえば、1 ~ 4 バイトが必要な場合は、デフォルトの 1 ~ 4 バイトを 1 ~ 3 バイトに変更します。utf8絵文字表現は、utf8mb4文字
ここに画像の説明を挿入

2.Mysql照合

データベースを作成する際には、「比較サイズ規則」と呼ばれることが多いソート規則もあります.実際、SQL
文が表示された場合、abcABCなど、それらをソートするためにどのようなアルゴリズムが必要ですか? aAbBcCを使用しますか?区別せずに abcABC をケース アルゴリズムでソートしますか、それともバイナリ比較でソートしますか?order by

各文字セットには、選択できる照合の束があります. これらの照合の接頭辞は、特定の文字セットのみが適用可能であることを示します. たとえば、次の照合utf8mb4 字符集のみ
ここに画像の説明を挿入
:ci、cs、binなど、意味は次のとおりです。
_ci比較では大文字と小文字が区別されません。
_cs比較では大文字と小文字が区別されます。
_binバイナリで比較します。

各照合順序の中間部分は、比較ルールが適用される言語を示します。たとえば、 utf8mb4_swedish_ciin はswedishスウェーデン語が使用されていることを示し、utf8mb4_general_ciin は言語に関係なく一般言語も公開比較であることgeneralを示します。

3. Mysql 文字セットの優先度

データベース、テーブル、列、および文字セットは、作成時に個別に指定できます. 3 つのいずれも文字セットを選択しない場合、Mysql はシステムレベルの文字セットを使用します. たとえば、作成時に文字セットが指定されていない場合データベースの場合、システム レベルが使用されます。同様に、テーブルで文字セットが指定されていない場合、データベースが使用されるなど、優先度レベルは次のとおりです。

系统 < 数据库 < 表 < 列

次に、各レベルの文字セットがどのように使用されているかを見てみましょう。

3.1 システムレベルの文字セット

3.1.1 システムの文字セットと比較規則を表示する

SHOW VARIABLES LIKE 'character_set_server'; # 字符集
SHOW VARABILES LIKE 'collation_server'; # 字符集的比较规则

set [variable_name]=[value]3.1.2 システム レベルの文字セットを変更し、比較ルールを構成アイテムを使用しmy.ini設定できます。ここでは、構成アイテムを例として使用します。

[server]
character_set_server=utf8
collation_server=utf8_unicode_ci

3.2 データベースの文字セット

3.2.1 データベースの文字セットと比較規則を表示する

SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';

3.2.2 データベースの文字セットと比較規則を指定する: データベース作成時に指定する

CREATE DATABASE [database_name] 
... 
CHARACTER SET utf8 COLLATE utf8_unicode_ci;

3.3 テーブル文字セット

3.3.1 テーブルの文字セットと比較規則を表示する

SHOW CREATE TABLE [table_name];

3.3.2 テーブルの文字セットと照合順序を指定する

# 创建表时指定
CREATE TABLE [table_name]
...
CHARACTER SET utf8 COLLATE utf8_unicode_ci;

# 修改表时重新指定
ALTER TABLE [table_name]
...
CHARACTER SET utf8 COLLATE utf8_unicode_ci;

3.4 列文字セット

3.4.1 列の文字セットと比較規則を表示する

SHOW CREATE TABLE [table_name];

3.4.2 列の文字セットと比較規則を指定する

# 在创建表时指定
CREATE TABLE [table_name]
user_name varchar(10) CHARASET SET utf8 COLLATE utf8_unicode_ci,
user_email varchar(10) CHARSET SET utf8 COLLATE utf8_unicode_ci);

# 修改列时重新指定
ALTER TABLE  [table_name] [column_name] [column_type] CHARACTER SET utf8 COLLATE utf8_general_ci;

4. Mysql クライアントとサーバー間の文字セットのやり取り

4.1 サーバーによるクライアントの文字セットの扱い

クライアントが入るSELECT user_name FROM users WHERE user_name='张三'张三サーバーに、という名前のユーザーを見つけるように指示しますが、しかし、しかし、コンピューターには文字セットの概念があり、クライアントのデフォルトの文字セットはシステムによって決定されます。 、デフォルトはgbk文字セットです。cmdコンソールの[プロパティ]から表示できます(Windowsは文字セットをコードページと呼びます)。したがって、この
ここに画像の説明を挿入
は実際にはgbkの形式でエンコードされ、サーバーに送信されます、では、サーバーはどのようにしてそれぞれを認識しますかSELECT user_name FROM users WHERE user_name='张三'? クライアントの要求がエンコードされているのはどのような文字セットですか? 答えは、character_set_clientシステム変数によって決定されるということです。character_set_clientデフォルトはオペレーティング システムの文字セットです。character_set_client値を。

考えてみてください。user_name フィールドで指定された文字セットが utf8 で、クライアントが user_name を gbk エンコーディングで送信した場合、クライアントのエンコーディングが保存されているエンコーディングと一致しないため、一致がないことは明らかであり、サーバーこの時点で空のプロンプトが表示されます ウールの布?

通常なら空が返ってくるはずなのですが、やはり人間の言葉なので、mysqlの作者が検索用にgbkを自動的にutf8に変換してくれるので、クライアントがgbkを設定すると、実際にはutf8のデータに普通にアクセスできるようになります。

ここに画像の説明を挿入

知らせ:

  1. これは mysql の組み込みの動作で、たとえば、ファイルを開くとき、エディタの文字セットとファイルを保存するときの文字セット セットが一致していることを確認して、文字化けが発生しないようにする必要があります。アクセスするとき。
  2. サーバーは、クライアントの文字セットを積極的に utf8 に変換しません. たとえば、クライアントの文字セットが latin1 に設定されている場合、サーバーは今回はそれを utf8 に変換しませんが、ユーザーが見つからないというプロンプトを表示します.ここでは、サーバーがそのような文字セットに中国語のエンコーディングが含まれているかどうかを認識し、含まれている場合はそれを utf8 に変換し、latin1 には中国語のエンコーディングがないため、もちろん、この側面に精通している学生がいる場合は、下にメッセージを残してください。

4.2 サーバー応答時の文字セット処理

user_name张三が であることサーバーはそれを utf8 データの形式で返しますか?
実際にはそうではありません. また, 適切な文字セットに変換されてクライアントに返されます. その変換はcharacter_set_resultsシステム初期化character_set_resultsと一貫性があります. これがクライアントがデータを表示できる理由です.サーバーが次の値でcharacte_set_clientに対して张三character_set_resultsgbk

このとき、クライアント側で文字化けを表示させたい場合は簡単で、charset_set_result値を効果を確認できます。

ここに画像の説明を挿入

5. まとめ

  • 私たちがコンピューター上で目にするすべての単語は、文字セットによってエンコード/デコードされ、人間が認識できる言語を表現しています.文字化けがある場合、文字セットが幽霊であることはすでにご存知だと思います.

  • Mysql は文字セットに対して特別な処理を行います。たとえば、utf8 の 1 ~ 4 バイトを 1 ~ 3 バイトにキャストし、クライアントの要求と文字セットへの応答に対して適切な変換処理を実行します。

おすすめ

転載: blog.csdn.net/cookcyq__/article/details/123512561
おすすめ