ファイルシステム上、データベース、テーブル識別子、そして名前の間には一致点があります。MySQLでは各データベースをデータディレクトリ内のディレクトリとして表現し、適切なデータベースディレクトリ内の1つかそれ以上のファイルで各テーブルを表現します。
MySQL
5.1.6以前では、ファイルシステムオブジェクトに一致するデータベースオブジェクトの識別子として使用できる文字に制限がありました。例えば、パスネーム分離文字と‘.
’は、テーブルファイル拡張の接頭子となるので使用できません
MySQL 5.1.6以降、ASCII NUL
(0x00
)を除く全ての文字は、データベースやテーブル識別子として有効です。MySQLはデータベースディレクトリやテーブルファイルを作成するとき、一致するファイルシステムオブジェクト内の問題文字を全てエンコードします。
基本的なローマ字(a..zA..Z
)
とディジット(0..9
)はこのようにエンコードされます。つまり、大文字/小文字を区別するかはファイルシステムの特徴に依存します。
他国のアルファベットで大文字/小文字マッピングが区別される場合は下記のようにエンコードされます。
Code range Pattern Number Used Unused Blocks ----------------------------------------------------------------------------- 00C0..017F [@][0..4][g..z] 5*20= 100 97 3 Latin1 Supplement + Ext A 0370..03FF [@][5..9][g..z] 5*20= 100 88 12 Greek + Coptic 0400..052F [@][g..z][0..6] 20*7= 140 140 137 Cyrillic 0530..058F [@][g..z][7..8] 20*2= 40 38 2 Armenian 2160..217F [@][g..z][9] 20*1= 20 16 4 Number Forms 0180..02AF [@][g..z][a..k] 28*11=220 203 17 Latin Ext B + IPA 1E00..0EFF [@][g..z][l..r] 20*7= 140 136 4 Latin Additional Extended 1F00..1FFF [@][g..z][s..z] 20*8= 160 144 16 Greek Extended .... .... [@][a..f][g..z] 6*20= 120 0 120 RESERVED 24B6..24E9 [@][@][a..z] 26 26 0 Enclosed Alphanumerics FF21..FF5A [@][a..z][@] 26 26 0 Full Width forms
シーケンス内の1バイトが大文字/小文字をエンコードします。例:LATIN
CAPITAL LETTER A WITH
GRAVE
は@0G
としてエンコードされ、LATIN
SMALL LETTER A WITH
GRAVE
は@0g
としてエンコードされます。ここでは、3番目のバイト(G
またはg
)
は大文字/小文字を指示します。(大文字/小文字を区別しないファイルシステムでは、両文字は同義として扱われます。)
言語ブロックの中にはキリル文字のように、2番目のバイトが大文字/小文字を決定することもあります。補足ラテン1言語ブロックでは、3番目のバイトが大文字/小文字を決定します。シーケンス内の2バイトが文字の場合(拡張ギリシャ語のように)、一番左の文字が大文字/小文字を表します。他全ての文字バイトは小文字でなければなりません。
大文字/小文字マッピングを持たないアルファベット文字(ヘブライ語など)と同様、全ての非文字キャラクタは、16進ディジットa..f
に対応する小文字を用いた16進表現でエンコードされます。
0x003F -> @003f 0xFFFF -> @ffff
16進値はucs2
ダブルバイトキャラクタセット内のキャラクタ値に一致します。
ウィンドウズ上では、nul
やprn
やaux
などの名前はデバイス名として保存されるため、ファイル名として使えません。MySQL
5.1.10以降、これらの名前はMySQLで許可されています。サーバが一致ファイルもしくはディレクトリを作成する際に、これらは@@@
を名前に付加されてエンコードされます。このようなことは全プラットフォーム上で、プラットフォーム間の一致データベースオブジェクトを移行する際に生じます。
バージョン5.1.6より前のMySQLのデータベースやテーブル内で、新エンコード利用機能がアップデートされていない特殊文字を使用している場合、INFORMATION_SCHEMA
テーブルやSHOW
ステートメントのアウトプット形式内では、#mysql50#
を接頭辞として名前が表示されます。例えば、a@b
のようなテーブル名があり、そのエンコーディング名がアップデートされてない場合、このように表示されます:SHOW
TABLES
。
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| #mysql50#a@b |
+----------------+
エンコーディングがアップデートされてない名前を参照するには、#mysql50#
接頭辞を付加しなければなりません。
mysql>SHOW COLUMNS FROM `a@b`;
ERROR 1146 (42S02): Table 'test.a@b' doesn't exist mysql>SHOW COLUMNS FROM `#mysql50#a@b`;
+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+
特殊な接頭辞を使用する必要を無くすため、旧名をアップデートするには、mysqlcheckで再エンコードしてください。次のコマンドは全ての名前を新エンコーディングにアップデートします。
shell> mysqlcheck --check-upgrade --fix-db-names --fix-table-names --all-databases
特定のデータベースもしくはテーブルのみを確認するには、--all-databases
を削除し、適切なデータベースやテーブル引数を付け加えてください。mysqlcheck起動構文に関するさらに詳しい情報は以下を参照してください。項7.11. 「mysqlcheck — テーブル メンテナンスと修復プログラム」