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
ここから、中国語Unicode
のutf-8
が、uft-8
文字セットは現在最も広く使用されています。
文字セットの詳細については割愛します. これは単なる予兆です. 文字セットの種類、歴史的なスキーム、文字エンコーディング規則などを学びたい場合は、興味のある学生は自分で学ぶことができます.
ここで、ファイルを開く際のいわゆる「文字化け」の問題を実装しましょう。
まず、次の内容のA.txt
テキスト
你好
次に、保存時にエンコーディング タイプを選択しますANSI
(以前は GBK23212)。エディタ
で開きます。Subline Text
你好
になっていることがわかりますÄãºÃ
。この問題の理由は、Subline Text
デフォルトutf-8
。[設定]Subline Text
オプション
また、私たちのものA.txt
はANSI
文字セットのエンコーディングで保存されているので、アヒルと話している写真があります. この問題を解決するのも非常に簡単です.Subline Text
デフォルトのます.効果を見てくださいANSI
A.txt
utf-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_ci
in はswedish
スウェーデン語が使用されていることを示し、utf8mb4_general_ci
in は言語に関係なく一般言語も公開比較であること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のデータに普通にアクセスできるようになります。
知らせ:
- これは mysql の組み込みの動作で、たとえば、ファイルを開くとき、エディタの文字セットとファイルを保存するときの文字セット セットが一致していることを確認して、文字化けが発生しないようにする必要があります。アクセスするとき。
- サーバーは、クライアントの文字セットを積極的に utf8 に変換しません. たとえば、クライアントの文字セットが latin1 に設定されている場合、サーバーは今回はそれを utf8 に変換しませんが、ユーザーが見つからないというプロンプトを表示します.ここでは、サーバーがそのような文字セットに中国語のエンコーディングが含まれているかどうかを認識し、含まれている場合はそれを utf8 に変換し、latin1 には中国語のエンコーディングがないため、もちろん、この側面に精通している学生がいる場合は、下にメッセージを残してください。
4.2 サーバー応答時の文字セット処理
user_name张三
が であることサーバーはそれを utf8 データの形式で返しますか?
実際にはそうではありません. また, 適切な文字セットに変換されてクライアントに返されます. その変換はcharacter_set_results
システム初期化character_set_results
と一貫性があります. これがクライアントがデータを表示できる理由です.サーバーが次の値でcharacte_set_client
に対して张三
character_set_results
gbk
このとき、クライアント側で文字化けを表示させたい場合は簡単で、charset_set_result
値を効果を確認できます。
5. まとめ
-
私たちがコンピューター上で目にするすべての単語は、文字セットによってエンコード/デコードされ、人間が認識できる言語を表現しています.文字化けがある場合、文字セットが幽霊であることはすでにご存知だと思います.
-
Mysql は文字セットに対して特別な処理を行います。たとえば、utf8 の 1 ~ 4 バイトを 1 ~ 3 バイトにキャストし、クライアントの要求と文字セットへの応答に対して適切な変換処理を実行します。