[MySQLスタディノート(3)] MySQLの文字セットと比較ルール

この記事は公式アカウント[DevelopingPigeon]から公開されています!フォローへようこそ!


古いルール-姉妹都市都市:

1。文字セットと比較ルール

(I.概要

       バイナリデータは実際にコンピュータに格納されます。文字列データの場合、文字列とバイナリデータのマッピング関係を確立して格納されます。まず文字範囲を定義し、次に文字をバイナリデータにマッピングするプロセスをエンコーディングと呼びます。バイナリデータがマッピングされます文字のプロセスはデコードです。文字セットは、特定の文字範囲のエンコード規則を表すために使用されます。つまり、文字セットは、どの文字がどのバイナリデータにマップされるかの規則を定義します。

       文字セットを設定した後、2文字のサイズを比較するにはどうすればよいですか?最も簡単に考えられるのは、2文字に対応するバイナリデータのサイズを直接比較することです。これは、バイナリ比較ルールと呼ばれます。ただし、実際には、多くの状況がより複雑です。たとえば、英字で大文字と小文字が区別されない場合は、大文字または小文字が異なる文字を大文字または小文字に変換してから、バイナリデータを比較する必要があります。

(2)一般的に使用される文字セット

1.ASCII文字セット

       スペース、句読点、数字、大文字と小文字などを含む合計128文字は、1バイト、つまり8ビットを使用してエンコードできます。

2. ISO8859-1文字セット

       合計256文字あり、西欧で一般的に使用されている128文字をASCIIに基づいて拡張し、1バイトエンコーディングも使用できます。

3.GB2312文字セット

       ASCII文字セットと互換性のある漢字などが含まれます。文字がASCII文字セットに含まれている場合は、1バイトのエンコードを使用し、そうでない場合は2バイトのエンコードを使用します。異なるバイト数を使用して文字を表すこのエンコード方式は、可変長エンコード方式と呼ばれます。

4.GBK文字セット

       GB2312と互換性のある拡張GB2312。

5.UTF-8文字セット

       すべての領域のほぼすべての文字が含まれ、ASCIIと互換性があり、可変長エンコーディングを使用し、1文字のエンコーディングは1〜4バイトを使用します。

       バイトを読み取るとき、バイトが単一の文字を表すのか、文字の一部を表すのかを区別するにはどうすればよいですか?バイトは0から127の範囲にあるため、つまり、バイトの最上位ビットは0であるため、バイトは1文字を表します。それ以外の場合、バイトの最上位ビットは1であり、127の範囲を超えています。それは2つの単語ですスタンザは文字を表します。


二。MySQLの文字セットと比較ルール

(A)utf8

       MySQLでは、文字セットは文字が使用する最大バイト長を表し、システムのストレージとパフォーマンスに影響します。utf8mb3は文字を表すために1〜3バイトのみを使用し、エイリアスはutf8です。utf8mb4は文字を表すために1〜4バイトを使用します。これは、本物のUTF-8文字セットです。

(2)文字セットを表示する

SHOW CHARSET LIKE 匹配模式;

       CHARSETとCHARACTERSETは同義語です。ASCII文字セットは1バイトを占め、latin1は1バイトを占め、GB2312は2バイトを占め、GBKは2バイトを占めます。

(3)比較ルールを表示する

SHOW COLLATION LIKE 匹配模式;

       文字セットは、いくつかの比較ルールに対応する場合があります。比較ルールの名前は、関連する文字セットの名前で始まります。たとえば、utf8比較ルールはすべてutf8で始まり、その後にutf8_polish_ciなどの比較ルールの言語が続きます。ポーランド語のマーキングルール、特別なものはutf8_general_ciで、これは一般的な比較ルールを意味します。

       最後の接尾辞は、アクセント、大文字と小文字、およびバイナリを意味します。たとえば、_ai(アクセントを区別しない)はアクセントを区別しない、_as(アクセントを区別する)はアクセントを区別する、_ ci(大文字と小文字を区別しない)は大文字と小文字を区別しない、_cs(大文字と小文字を区別する)は大文字と小文字を区別する、_bin(バイナリ)はバイナリ比較を意味します。

三。文字セットと比較ルールの適用

       文字セットと比較ルールは互いに対応しており、どちらが変更されても、対応するものは自動的に変更されます。

(1)4つのレベルの文字セット比較ルール

1.サーバーレベル

       2つのシステム変数は、サーバーレベルの文字セットと比較ルールを表します。

character_set_server : 服务器级别的字符集;
collation_server : 服务器级别的比较规则;

       サーバープログラムを起動するときに、起動オプションまたは構成ファイルを使用して、これら2つの変数の値を変更できます。

2.データベースレベル

       データベースを作成および変更するときに、データベースの文字セットと比較ルールを指定できます。同様に、データベースレベルで文字セットと比較ルールを表す2つのシステム変数があります。

character_set_database;
collation_database;

       データベースを作成および変更するときに、データベースの文字セットと比較ルールを設定します。

CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_polish_ci;
ALTER DATABASE test CHARACTER SET utf8 COLLATE utf8_polish_ci;

       データベースの作成時に文字セットと比較ルールが指定されていない場合は、サーバーレベルの文字セットと比較ルールが使用されます。

3.テーブルレベル

       同様に、テーブルを作成および変更するときは、テーブルの文字セットと比較ルールを指定します。指定しない場合は、データベースを継承します。

4.列レベル

       文字列を格納する列の場合、同じテーブル内の異なる列にも異なる文字セットと比較ルールを含めることができます。これらは、列を作成または変更するときに指定できます。

CREATE TABLE 表名 (
	列名 字符串类型 CHARACTER SET 字符集名称 COLLATE 比较规则名称
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 CHARACTER SET 字符集名称 COLLATE 比较规则名称;

       同様に、列の文字セットと比較規則を指定しない場合、テーブルは継承されます。保存するデータに応じて、セット列の文字セットと比較ルールを選択します。

(2)クライアントとサーバー間の通信で設定された文字

       マシンの観点からは、クライアントによって送信された要求とサーバーによって返される応答は、基本的にバイトのシーケンスです。要求/応答プロセス中に、多くの文字セット変換が行われました。

1.クライアントがリクエストを送信します

       一般に、要求文字列をエンコードするときにクライアントが使用する文字セットは、オペレーティングシステムが現在使用している文字セットと一致します。これは、Unixのようなオペレーティングシステムではルールですが、Windowsシステムでは、起動時に指定するとMySQLクライアントプログラムdefault-character-set起動オプションが使用されている場合、要求された文字列はこの文字セットでエンコードされます。

       Unixライクなシステムでは、次のコマンドを使用して、現在のシステムの文字セットを表示します。

echo $LC_ALL

2.サーバーがリクエストを受信します

       サーバーはバイトシーケンスを受信し、サーバーはこのバイトシーケンスを、SESSIONレベルのシステム変数character_set_clientで表される文字セットでエンコードされたバイトシーケンスと見なします。要求文字列をエンコードするときにクライアントが使用する文字セットと、バイトシーケンスを受信するときにサーバーが考慮するバイトシーケンスが使用するエンコード文字セットは、2つの独立した文字セットであることがわかります。


3.サーバーがリクエストを処理します

       実際のプロセッサが要求すると、character_set_clientに対応する文字セットによってエンコードされたバイトシーケンスがSESSIONレベル変数character_set_connectionによってエンコードされたバイトシーケンスに変換され、collat​​ion_connectionは対応する比較ルールを表します。

4.サーバーが応答を生成します

       サーバーは要求を処理した後、結果をクライアントに直接送信しませんが、SESSIONレベルのシステム変数character_set_resultsに対応する文字セットをエンコードに使用してから、クライアントに送信します。


5.クライアントは応答を受け入れます

       Unixライクは、オペレーティングシステムの文字セットを使用して応答のバイトシーケンスを解釈し、Windowsはクライアントのデフォルトの文字セットを使用して解釈します。


6.クライアントのデフォルトの文字セット

       各MySQLクライアントは、クライアントのデフォルトの文字セットを維持します。クライアントは、システムの起動時にシステムで現在使用されている文字セットを自動的に検出し、特定のルールに従ってMySQLでサポートされている文字セットにマップします。MySQLがシステムの文字セットをサポートしていない場合は、クライアントのデフォルトの文字セットをMySQLのデフォルトの文字セットに設定します。default-character-set起動オプションが指定されている場合、このオプションはクライアントのデフォルトオプションとして使用されます。MySQLのデフォルトの文字セットは、5.7より前のlatin1と8.0より後のutfmb4です。

       サーバーに接続するとき、サーバーはcharacter_set_client、character_set_connection、およびcharacter_set_resultsをクライアントのデフォルトの文字セットに初期化します。

おすすめ

転載: blog.csdn.net/Mrwxxxx/article/details/113795388
おすすめ