データベース識別子やテーブル識別子とファイルシステム内の名前との間には対応があります。基本構造では、MySQL
は各データベースをデータディレクトリ内のディレクトリとして表現し、各テーブルを適切なデータベースディレクトリ内の
1
つ以上のファイルで表現します。テーブル形式のファイル
(.FRM
)
の場合、データは常にこの構造と場所に格納されます。
データファイルとインデックスファイルの場合、ディスク上の正確な表現はストレージエンジンによって異なります。これらのファイルを
FRM
ファイルと同じ場所に格納することも、その情報を別のファイルに格納することもできます。InnoDB
データは InnoDB
データファイルに格納されます。InnoDB
でテーブル領域を使用する場合は、新たに作成した特定のテーブル領域ファイルが代わりに使用されます。
MySQL 5.1.6
よりも前のバージョンでは、ファイルシステムオブジェクトに対応するデータベースオブジェクトの識別子として使用できる文字に制限があります。たとえば、パス名区切り文字は使用できません。また、「.
」
はテーブルファイルの拡張子の前に付ける文字であるため使用できません。
MySQL 5.1.6 以降、ASCII NUL
(0x00
)
を除くすべての文字は、データベースやテーブル識別子として有効です。MySQL
では、データベースディレクトリやテーブルファイルを作成するとき、対応するファイルシステムオブジェクト内で問題のある文字をすべてエンコードします。
基本的なローマ字
(a..z、A..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
進数字に対応する小文字を用いた 16
進表現でエンコードされます
(a..f
)。
0x003F -> @003f 0xFFFF -> @ffff
16 進値は、ucs2
ダブルバイトキャラクタセット内のキャラクタ値に対応します。
Windows
では、nul
、prn
、aux
などの名前はデバイス名として予約されているため、ファイル名には使用できません。MySQL
5.1.10 以降、これらの名前は MySQL
で許可されています。サーバーが一致ファイルまたはディレクトリを作成する際に、これらは@@@
を名前に付加されてエンコードされます。このようなことは全プラットフォーム上で、プラットフォーム間の一致データベースオブジェクトを移行する際に生じます。
MySQL 5.1.6
より前のバージョンのデータベースやテーブル内で特殊文字を使用し、その配下のディレクトリ名やファイル名が、その特殊文字に新しいエンコーディングを使用するように更新されていない場合、サーバーは
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
呼び出し構文については、項3.3. 「mysqlcheck — テーブル保守プログラム」を参照してください。
#mysql50#
接頭辞は、サーバーが内部的に使用するためだけのものです。この接頭辞を使用する名前でデータベースやテーブルを作成しないようにしてください。
また、mysqlcheck
は、特殊文字をエンコードするために使用する
@
文字のリテラルインスタンスが含まれる名前を修正できません。この文字が含まれるデータベースやテーブルを使用している場合は、mysqldump
でそれらのダンプを取ってから MySQL 5.1.6
以降にアップグレードし、アップグレード後にダンプファイルを再ロードします。