データベース識別子やテーブル識別子とファイルシステム内の名前との間には対応があります。基本構造では、MySQL は各データベースをデータディレクトリ内のディレクトリとして表現し、各テーブルを適切なデータベースディレクトリ内の 1 つ以上のファイルで表現します。テーブル形式のファイル (.FRM
) の場合、データは常にこの構造と場所に格納されます。
データファイルとインデックスファイルの場合、ディスク上の正確な表現はストレージエンジンによって異なります。これらのファイルを FRM
ファイルと同じ場所に格納することも、情報を別のファイルに格納することもできます。InnoDB
データは InnoDB データファイルに格納されます。InnoDB
でテーブルスペースを使用する場合は、新たに作成した特定のテーブルスペースファイルが代わりに使用されます。
データベース識別子またはテーブル識別子では、ASCII NUL (0x00
) を除いたすべての文字が正当です。MySQL では、データベースディレクトリやテーブルファイルを作成するとき、対応するファイルシステムオブジェクト内で問題のある文字をすべてエンコードします。
基本的なラテン文字 (
a..zA..Z
)、数字 (0..9
)、および下線 (_
) はそのままエンコードされます。このため、それらが大文字と小文字を区別するかどうかは、ファイルシステムの特性に直接依存します。-
大文字と小文字のマッピングを持つアルファベット起源のほかの国の文字はすべて、次の表に示すようにエンコードされます。コード範囲カラムの値は UCS-2 値です。
コード範囲 パターン 番号 使用 未使用 ブロック 00C0..017F [@][0..4][g..z] 5*20= 100 97 3 補足ラテン語-1 + 拡張ラテン語-A 0370..03FF [@][5..9][g..z] 5*20= 100 88 12 ギリシア語およびコプト語 0400..052F [@][g..z][0..6] 20*7= 140 137 3 キリル文字 + 補足キリル文字 0530..058F [@][g..z][7..8] 20*2= 40 38 2 米語 2160..217F [@][g..z][9] 20*1= 20 16 4 数の形式 0180..02AF [@][g..z][a..k] 20*11=220 203 17 拡張ラテン語-B + 拡張 IPA 1E00..1EFF [@][g..z][l..r] 20*7= 140 136 4 拡張ラテン語追加 1F00..1FFF [@][g..z][s..z] 20*8= 160 144 16 拡張ギリシャ語 .... .... [@][a..f][g..z] 6*20= 120 0 120 RESERVED 24B6..24E9 [@][@][a..z] 26 26 0 囲み文字 FF21..FF5A [@][a..z][@] 26 26 0 全角と半角 シーケンス内の 1 バイトが大文字と小文字の区別をエンコードします。例:
LATIN CAPITAL LETTER A WITH GRAVE
は@0G
としてエンコードされ、LATIN SMALL LETTER A WITH GRAVE
は@0g
としてエンコードされます。ここでは、3 番目のバイト (G
またはg
) が大文字と小文字の区別を示します。(大文字と小文字を区別しないファイルシステムでは、両文字は同じ文字として扱われます。)言語ブロックの中にはキリル文字のように、2 番目のバイトが大文字と小文字の区別を決定することもあります。補足ラテン語 1 などのほかの言語ブロックでは、3 番目のバイトが大文字と小文字の区別を決定します。シーケンス内の 2 バイトが文字の場合は (拡張ギリシャ語など)、いちばん左の文字が大文字と小文字の区別を表します。ほかの文字バイトはすべて、小文字である必要があります。
-
下線 (
_
) を除くすべての文字以外のキャラクタは、大文字と小文字のマッピングのないアルファベット起源の文字 (ヘブライ語など) とともに、a..f
の 16 進値に小文字を使用した 16 進表現を使用してエンコードされます。0x003F -> @003f 0xFFFF -> @ffff
16 進値は、
ucs2
ダブルバイト文字セット内のキャラクタ値に対応します。
Windows では、nul
、prn
、aux
などの一部の名前は、サーバーが対応するファイルまたはディレクトリを作成するときに、@@@
を名前に付加することによってエンコードされます。これは、対応するデータベースオブジェクトのプラットフォーム間での移植性のためにすべてのプラットフォームで行われます。
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 --all-databases
shell> mysqlcheck --fix-db-names --fix-table-names --all-databases
特定のデータベースまたはテーブルのみを確認するには、--all-databases
を削除し、適切なデータベースやテーブル引数を付け加えてください。mysqlcheck 呼び出し構文については、セクション4.5.3「mysqlcheck — テーブル保守プログラム」を参照してください。
#mysql50#
プリフィクスは、サーバーが内部的に使用するためだけのものです。このプリフィクスを使用する名前でデータベースやテーブルを作成しないようにしてください。
また、mysqlcheck は、特殊文字をエンコードするために使用する @
文字のリテラルインスタンスが含まれる名前を修正できません。この文字が含まれるデータベースやテーブルを使用している場合は、mysqldump でそれらをダンプしてから MySQL 5.1.6 以降にアップグレードし、アップグレード後にダンプファイルをリロードします。