MySQL 5.1 リファレンスマニュアル :: 8 言語構造 :: 8.2 識別子 :: 8.2.3 ファイル名への識別子のマッピング
« 8.2.2 識別子の大文字/小文字区別

8.2.4 関数名の構文解析と名前解決 »
Section Navigation      [Toggle]
  • 8.2 識別子
  • 8.2.1 識別子の修飾語
  • 8.2.2 識別子の大文字/小文字区別
  • 8.2.3 ファイル名への識別子のマッピング
  • 8.2.4 関数名の構文解析と名前解決

8.2.3. ファイル名への識別子のマッピング

ファイルシステム上、データベース、テーブル識別子、そして名前の間には一致点があります。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 — テーブル メンテナンスと修復プログラム」

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates