[MySQL]文字セットとソート方法


基本概念
•文字(Character)とは、人間の言語の中で最も小さい意味記号を指す.例えば「A」、「B」など;
•一連の文字が与えられ、各文字に数値が与えられ、対応する文字を数値で表す.この数値が文字の符号化(Encoding)である.例えば、文字'A'に数値0を与え、文字'B'に数値1を与えると、0は文字'A'の符号化である.
•一連の文字が与えられ、対応する符号化が与えられると、これらすべての文字と符号化ペアからなる集合が文字セット(Character Set)となる.例えば、与えられた文字リストが{'A','B'}である場合、{'A'=>0,'B'=>1}は文字セットである.
•文字順(Collation)とは、同じ文字セット内の文字間の比較ルールです.
•文字順を決定してから、1つの文字セットで等価な文字と、文字間のサイズ関係を定義できます.
•各文字順は1つの文字セットのみに対応しますが、1つの文字セットは複数の文字シーケンスに対応します.1つはデフォルトの文字シーケンス(Default Collation)です.
•MySQLの文字順名は命名規則に従う:文字順に対応する文字セット名で始まる;で、ci(大文字と小文字が敏感でないことを示す),cs(大文字と小文字が敏感であることを示す)または_bin(符号化値で比較することを示す)の末尾.例えば、文字順「utf 8_general_ci」の下で、文字「a」と「A」は等価である.
文字セットとソート方法
文字セットとソート方法の関係は、1つの文字セットに1つ以上のソート方法があり、デフォルトのソート方法があります.次の例で説明します.
mysql> show character set like '%gbk%';
+---------+------------------------+-------------------+--------+
| Charset | Description            | Default collation | Maxlen |
+---------+------------------------+-------------------+--------+
| gbk     | GBK Simplified Chinese | gbk_chinese_ci    |      2 | 
+---------+------------------------+-------------------+--------+
1 row in set (0.00 sec)

mysql> show collation like '%gbk%';
+----------------+---------+----+---------+----------+---------+
| Collation      | Charset | Id | Default | Compiled | Sortlen |
+----------------+---------+----+---------+----------+---------+
| gbk_chinese_ci | gbk     | 28 | Yes     | Yes      |       1 | 
| gbk_bin        | gbk     | 87 |         | Yes      |       1 | 
+----------------+---------+----+---------+----------+---------+
2 rows in set (0.00 sec)
上記の例から、文字セットgbkには2つのソート方式(それぞれgbk_chinese_ci何gbk_bin)があり、デフォルトのソート方式はgbk_chinese_ci.
ソート方法の命名規則は、文字セット名_です.言語_各典型的な接尾辞の意味は次のとおりです.
1)_ci:大文字と小文字を区別しないソート方法
2)_cs:大文字と小文字を区別するソート方法
3)_bin:バイナリソート方式、サイズ比較は文字によって符号化され、人間の言語には関与しないため、_binのソート方法には人間の言語は含まれていません
従ってgbk_chinese_ciソート方式は,文字セットがgbkであり,人間言語では中国語でサイズを比較し,比較時には大文字と小文字を区別する.
一般的な関数
文字セットガイド
文字セット・ブートでは、MySQLで文字定数を説明する文字セットを指定できます.構文は次のとおりです.
_charset str
次のようになります.
_utf 8'ABCD'は、utf 8文字セットで文字列定数'ABCD'を格納することを表す
文字セットガイドによって修飾されたテキスト文字列は、要求中に余分なトランスコードを経ずに、直接内部文字セット処理に変換される.
文字セット変換
convert()関数は、1つの文字列を指定した文字セットに変換します.構文は次のとおりです.
convert(str using charset)
convert('ABCD'using utf 8)が示すように'ABCD'の文字セットをuft 8に変換する
length()関数--バイトの長さを返します
char_length()--文字長を返します
文字セットに関連するシステム変数
文字セットに関連するシステム変数を表示するには、次の文を使用します.
mysql> show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | latin1 | 
| character_set_connection | latin1 | 
| character_set_database   | gbk    | 
| character_set_filesystem | binary | 
| character_set_results    | latin1 | 
| character_set_server     | gbk    | 
| character_set_system     | utf8   | 
+--------------------------+--------+
7 rows in set (0.01 sec)

mysql> show variables like 'collation\_%';              
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci | 
| collation_database   | gbk_chinese_ci    | 
| collation_server     | gbk_chinese_ci    | 
+----------------------+-------------------+
3 rows in set (0.00 sec)
の意味は次のとおりです.
character_set_System:MySQLデータベース識別子で使用される文字セット、常にutf 8
character_set_serverとcollation_server:サーバのデフォルト文字セットとソート方法
character_set_databaseとcollation_Database:現在のデータベースのデフォルト文字セットとソート方法
次の3つの変数は、クライアントとサーバ間の通信に影響します.
character_set_Client:クライアントがサーバにSQL文で使用する文字セットを送信する
character_set_results:サーバがクライアントに結果を返すときに使用する文字セット
character_set_接続:characterとset_クライアントとは異なり、クライアントから送信されたSQL文は指定された文字セットに変換されます.
デフォルトでは、上記の3つの変数は同じ値に設定されています.クライアントが別の文字セットを使用してサーバと通信したい場合は、次のように変更できます.
set character_set_client = utf8;
set character_set_results = utf8;
set character_set_connection = utf8;
または、より簡単な方法は、次の文を使用しても同じ効果が得られます.
set names 'utf8';

MySQLでの文字セット変換プロセス
1.MySQL Serverがリクエストを受信すると、リクエストデータがcharacter_から取得されます.set_クライアントをcharacterに変換set_connection; 2.内部操作を行う前に要求データをcharacter_からset_接続は内部操作文字セットに変換され、その決定方法は以下の通りである:-各データフィールドのCHARACTER SET設定値を使用する;-上記値が存在しない場合、対応データテーブルのDEFAULT CHARACTER SET設定値(MySQL拡張、非SQL規格)を使用する.-上記値が存在しない場合は、対応するデータベースのDEFAULT CHARACTER SET設定値を使用する.-上記の値が存在しない場合はcharacter_を使用します.set_server設定値. 
3.操作結果を内部操作文字セットからcharacter_に変換するset_results.
ここでは、文字セットが設定されていないため、テーブルのデータセットbを使用するテーブルには文字セットが指定されていません.デフォルトでは、データ在庫を使用する文字セットcデータベースは、作成時に文字セットが指定されていないため、character_を使用します.set_server設定値dわざわざcharacterを修正しなかったset_serverの指定文字セットなのでmysqlデフォルトe mysqlデフォルトを使用する文字セットはlatin 1なので、latin 1文字セットを使用し、character_set_connectionの文字セットはUTF-8で、中国語の文字化けしは避けられない.
文字セットの問題を検出するいくつかの方法•SHOW CHARACTER SET;    • SHOW COLLATION;     • SHOW VARIABLES LIKE ‘character%’;     • SHOW VARIABLES LIKE ‘collation%’; •SQL関数HEX、LENGTH、CHAR_LENGTH•SQL関数CHARSET、COLLATION
MySQL文字セットを使用する場合の推奨•データベース/テーブルを作成し、データベース操作を行う場合は、MySQLのデフォルト設定に依存するのではなく、使用する文字セットを明示的に示すようにします.そうしないと、MySQLのアップグレードに大きな問題が発生する可能性があります.•データベースと接続文字セットがlatin 1を使用している場合、ほとんどの場合文字化けの問題を解決できるが、文字単位でSQL操作ができないという欠点があり、一般的にデータベースと接続文字セットをutf 8にするのが良い.•mysql CAPI(mysqlがC言語操作を提供するAPI)を使用する場合、データベースハンドルを初期化してすぐにmysql_を使用options設定MYSQL_SET_CHARSET_NAME属性はutf 8であり、SET NAMES文で接続文字セットを明示的に指定せずmysql_ping再接続が切断された長い接続時にも接続文字セットをutf 8にリセットします.•mysql PHP APIでは、一般ページレベルのPHPプログラムの総実行時間が短く、データベースに接続した後、SET NAMES文で接続文字セットを明示的に設定すればよい.ただし、長い接続を使用する場合は、接続をスムーズに維持し、再接続を解除した後、SET NAMES文で接続文字セットを明示的にリセットすることに注意してください.
その他の注意事項•my.cnfのdefault_character_set設定はmysqlコマンドでサーバに接続するときの接続文字セットにのみ影響し、libmysqlclientライブラリを使用するアプリケーションには何の役にも立たない!•フィールドに対するSQL関数の操作は、通常、接続文字セットの設定の影響を受けない内部操作文字セットで行われます.•SQL文の裸文字列は、接続文字セットやintroducer設定の影響を受けます.比較などの操作ではまったく異なる結果になる可能性がありますので、注意してください.
MySQLデフォルト文字セットMySQL文字セットの指定は、データベース、テーブル、列にドリルダウンできます.従来のプログラムでは、データベースやデータテーブルを作成する際にそれほど複雑な構成は使用されておらず、デフォルトの構成が使用されている.(1)MySQLをコンパイルするとき、デフォルトの文字セットを指定します.この文字セットはlatin 1です.(2)MySQLをインストールする場合、プロファイル(my.ini)にデフォルトの文字セットを指定できます.指定しない場合、この値はコンパイル時に指定されたものを継承します.(3)mysqldを起動すると、コマンドラインパラメータにデフォルトの文字セットを指定できます.指定しない場合、この値はプロファイルの構成から継承され、character_set_serverはこのデフォルトの文字セットに設定されます.(4)MySQLのインストールマルチ言語サポートを選択すると、インストーラは自動的にプロファイルにdefault_をcharacter_setはUTF-8に設定され、デフォルトですべてのデータベースのすべてのテーブルのすべての列がUTF-8で格納されることを保証します.デフォルト文字セットの表示(デフォルトではmysqlの文字セットはlatin 1(ISO_8859_1)ですが、上記のコマンドでデフォルト文字セットの変更(1)を行う最も簡単な変更方法は、mysqlのmyを変更することです.iniファイルのdefault-character-set=utf 8 character_などの文字セットキー値set_server=utf 8修正後、mysqlのサービスを再起動する(2)mysqlのコマンドmysql>SET character_を使用する文字セットを変更する方法もありますset_client = utf8 ;      mysql> SET character_set_connection = utf8 ;      mysql> SET character_set_database = utf8 ;      mysql> SET character_set_results = utf8 ;      mysql> SET character_set_server = utf8 ;      mysql> SET collation_connection = utf8 ;      mysql> SET collation_database = utf8 ;      mysql> SET collation_server = utf8 ; テーブルのデフォルト文字セットがutf 8に設定され、UTF-8符号化によってクエリーが送信され、データベースに格納された文字は依然として文字化されていない.その接続レイヤに問題がある可能性があります.解決策は、クエリーを送信する前に、SET NAMES'utf 8'を実行することです.次の3つの命令に相当します:SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8;
また、端末の符号化にも特に注意し、connectionの符号化と一致することが望ましい.