Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  識別子とファイル名のマッピング

9.2.3 識別子とファイル名のマッピング

データベース識別子やテーブル識別子とファイルシステム内の名前との間には対応があります。基本構造では、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 では、nulprnaux などの一部の名前は、サーバーが対応するファイルまたはディレクトリを作成するときに、@@@ を名前に付加することによってエンコードされます。これは、対応するデータベースオブジェクトのプラットフォーム間での移植性のためにすべてのプラットフォームで行われます。

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 以降にアップグレードし、アップグレード後にダンプファイルをリロードします。