無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

第8章 言語構造

この章では、MySQL使用時における、以下のSQLステートメント要素の記述規則について説明します。

  • リテラル値:文字列と数値

  • 識別子:データベース名、テーブル名、カラム名

  • 予約語

  • ユーザ変数とシステム変数

  • コメント

8.1. リテラル値

このセクションでは、MySQLでリテラル値を記述する方法について説明します。リテラル値には、文字列、数値、16進値、ブール値そしてNULLが含まれます。また、MySQLでこれらの基本データ型を処理するときに遭遇するであろう、さまざまなニュアンスと「りょーかい事項」についても扱います。

8.1.1. 文字列

文字列は、単一引用符 (‘'’)または二重引用符 (‘"’)で囲まれたバイトもしくは文字の並び(シーケンス)です。次に例を示します:

'a string'
"another string"

ANSI_QUOTES SQLモードで実行時は、文字列リテラルは単一引用符でのみ囲まれます。これは、二重引用符で引用された文字列は識別子として解釈されるためです。

バイナリ文字列はキャラクタセットや照合順序を持たないバイト列のことです。 バイナリでない文字列は、キャラクタセットや照合順序を持つ文字列のことです。これら両方の文字列タイプは、文字列ユニットの数値に基づいて比較されます。バイナリ文字列にとって、ユニットとはバイトのことです。バイナリでない文字列にとってユニットとは文字であり、マルチバイト文字を認めるキャラクタセットもあります。文字値の順序は、文字列照合順序の関数です。

文字列リテラルでは、オプションとしてキャラクタセットイントロデューサとCOLLATE節を指定することができます。

[_charset_name]'string' [COLLATE collation_name]

例:

SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

これら文字列構文についてさらに詳しく知りたい場合は、次を参照してください。項9.3.5. 「文字列リテラルのキャラクタセットおよび照合順序」

一部のシーケンスは、個々の文字列内で特別な意味を持ちます。これらのシーケンスは、いずれも、エスケープ文字として知られるバックスラッシュ(‘\’)で始まります。MySQLでは、次のエスケープシーケンスが認識されます。

\0 ASCII 0 (NUL) 文字。
\' 単一引用符 (‘'’) 文字。
\" 二重引用符(‘"’) 文字。
\b バックスペース文字。
\n 改行文字(LF)。
\r 復帰改行文字。
\t タブ文字。
\Z ASCII 26 (Control-Z)。表の下部にある注釈を参照してください。
\\ バックスラッシュ(‘\’)文字。
\% %’文字。表の下部にある注釈を参照してください。
\_ _’ 文字。表の下部にある注釈を参照してください。

他のすべてのエスケープシーケンスに対して、バックスラッシュは無視されます。つまり、エスケープされた文字がエスケープされていないと解釈されます。例えば、‘\x’はただの‘x’となります。

これらのシーケンスは大文字と小文字が区別されます。例えば、‘\b’はバックスペースと解釈されますが、‘\B’は‘B’と解釈されます。

ASCII(26)‘\Z’。この文字をコード化することによって、ASCII(26) が Windows では END-OF-FILE を表すという問題を回避することができます。ASCII(26) では、mysql db_name < file_name. を使用する場合に問題が発生します)。

エスケーププロセスはcharacter_set_connectionシステム変数により指定されたキャラクタセットに応じて実行されます。で項9.3.5. 「文字列リテラルのキャラクタセットおよび照合順序」説明されたとおり、他キャラクタセットを指定するイントロデューサが先行する文字列に対しても同じことがいえます。

\%’と‘\_’シーケンスはパターン照合コンテキスト内で、本来であればワイルドカード文字として解釈されるシーケンス‘%’と‘_’のリテラル使用例を検索するのに使われます。項11.3.1. 「文字列比較関数」内のLIKEオペレータに関する記述を参照してください。.パターン照合でないコンテキストでは、‘\%’または‘\_’を使用したときに、‘%’と‘_’の代わりに、文字列‘\%’と‘\_’がそれぞれ返されます。

文字列に引用符を含める方法は、いくつかあります。

  • '’で囲んだ文字列内で、‘'’を使用する場合、‘''’と記述することができます。

  • "’で囲んだ文字列内で、‘"’を使用する場合、‘""’と記述することができます。

  • 引用符の直前にエスケープ文字 (‘\’)を使用することができます。

  • "’で囲んだ文字列内で‘'’を使用する場合は、‘'’を二つ続けて入力したり、エスケープしたりなどの特別な処置を行う必要はありません。同様に、‘'’で囲んだ文字列内で‘"’を使用する場合も、特別使いする必要はありません。

次のSELECTステートメントは、文字列の引用とエスケープが実際にどのように働くかを示しています。

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

文字列のカラム(BLOBなど)にバイナリデータを挿入する場合、次の文字はエスケープシーケンスを使って表現する必要があります。

NULNULASCII 0、バイト。この文字は‘\0’ (バックスラッシュ+ASCII ‘0’文字)で表現します。
\ASCII 92、バックスラッシュ。‘\\’として表現します。
'ASCII 39、単一引用符。‘\'’として表現します。
"ASCII 34、二重引用符。‘\"’として表現します。

アプリケーションプログラムを書く場合、 MySQLサーバに送信されるSQLステートメント内で文字がデータ値として使用される前に、これら特殊文字のいずれかを含む可能性のある文字列は正確にエスケープされなければなりません。二通りの実行方法があります。

  • 特殊文字をエスケープする関数を使い文字列を処理してください。C コードを書く場合は、文字をエスケープする目的で C API 関数mysql_real_escape_string()を使用できます。項23.2.3.53. 「mysql_real_escape_string()を参照してください。Perl DBI インターフェースでは、quoteメソッドを使用して特殊文字を適切なエスケープシーケンスに変換することができます。 項23.4. 「MySQL Perl API」を参照してください。他の言語インターフェースでも同様の機能が利用できることがあります。

  • または、MySQL API の多くのものが一種のプレースホルダ機能を備えているため、この機能を使ってステートメント文字列に特殊なマーカーを挿入し、ステートメントの発行時にデータ値をそれらのマーカーにバインドすることもできます。この場合、値内の特殊文字のエスケープ処理が API によって自動で行われます。

8.1.2. 数値

整数は数字の列として表現されます。浮動小数点は小数を区切るのに‘.’を使用します。数値型は正負の値を指定するのに‘-’や‘+’を先頭に付けることもあります。

有効な整数の例:

1221
0
-32

有効な浮動小数点の例:

294.42
-32032.6809e+10
148.00

浮動小数点のコンテキストで整数を使用することもできます。この場合、整数は同等の浮動小数点数として解釈されます。

8.1.3. 16 進値

MySQLでは、16進値をサポートしています。数値のコンテキストでは、16 進値は整数(64 ビット精度)のように動作します。文字列のコンテキストでは、16 進値はバイナリ文字列のように動作します。この場合、16 進数の各ペアが 1 文字に変換されます。

mysql> SELECT x'4D7953514C';
        -> 'MySQL'
mysql> SELECT 0xa+0;
        -> 10
mysql> SELECT 0x5061756c;
        -> 'Paul'

16 進値のデフォルトのデータ型は文字列です。16 進値の文字列が確実に数値として扱われるようにするには、その文字列に対してCAST(... AS UNSIGNED)を使用します。

mysql> SELECT 0x41, CAST(0x41 AS UNSIGNED);
        -> 'A', 65

x'hexstring' 構文は標準 SQL に基づいています。0x 構文はODBCに基づいています。16 進文字列は、BLOBカラムの値を提供する目的で、ODBC によって使用されることがよくあります。

文字列または数値を 16 進形式の文字列に変換するには、HEX()関数を使用できます。

mysql> SELECT HEX('cat');
        -> '636174'
mysql> SELECT 0x636174;
        -> 'cat'

8.1.4. ブール値

TRUEFALSE の定数はそれぞれ10として評価されます。定数名は大文字/小文字の区別がなされません。

mysql> SELECT TRUE, true, FALSE, false;
        -> 1, 1, 0, 0

8.1.5. ビットフィールド値

ビットフィールド値はb''表記方法を用いて表現できます。は0と1を用いて書かれたバイナリ値です。

ビットフィールド表記はBIT カラムに割り当てる値を指定するのに便利です。

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
+------+----------+----------+----------+
| b+0  | BIN(b+0) | OCT(b+0) | HEX(b+0) |
+------+----------+----------+----------+
|  255 | 11111111 | 377      | FF       |
|   10 | 1010     | 12       | A        |
+------+----------+----------+----------+

8.1.6. NULL

NULL値は「データなし」を意味します。NULLは大文字/小文字どちらでも表記できます。

NULL値は、数値型での 0や文字列型での空文字列などの値とは異なります。項B.1.5.3. 「Problems with NULL Values」を参照してください。

テキストファイルのインポートまたはエクスポート形式 LOAD DATA INFILE または SELECT ...INTO OUTFILE の使用時には、NULL\Nで表現することができます。項12.2.5. 「LOAD DATA INFILE 構文」 を参照してください。

8.2. 識別子

データベース、テーブル、インデックス、カラム、そしてエイリアスは識別子です。このセクションではMySQLの識別子で使用できる構文を記述します。

下記テーブルは各識別子の長さ(最長時)記しています。

識別子最長(バイト)
データベース64
テーブル64
カラム64
インデックス64
エイリアス255

識別子に現れる文字には制限があります。

  • 識別子内でASCII 0 (0x00) および255のビット値は使用できません。

  • 識別子内での識別引用符使用は許可されていますが、必要でなければ使用は避けてください。

  • データベース名、テーブル名、そしてカラム名はスペース文字で終われません。

  • MySQL 5.1.6前では、データベース名には‘/’、‘\’、 ‘.’やディレクトリー名で許可されていない文字を使用することはできませんでした。

  • MySQL 5.1.6前では、テーブル名には‘/’、‘\’、 ‘.’やファイル名で許可されていない文字を使用することはできませんでした。

  • 識別子の長さは文字数ではなく、バイト数で表現されます。識別子名にマルチバイト文字を使用している場合、長さは使用した文字の合計バイト数で表現されます。

MySQL 5.1.6より、データベース名とテーブル名内の特殊文字は項8.2.3. 「ファイル名への識別子のマッピング」で記述されているとおり、対応するファイルシステム名にコード化されています。旧バージョンのMySQLを使用していて、で特殊文字を含むデータベース名やテーブル名が新しいエンコーディングに対応するようアップデートされていない場合、#mysql50#が接頭に表示されます。そういった名称を検索、もしくはそれらを新しいエンコーディングに変換するには、そのセクションを参照してください。

識別子は(UTF-8)を使って保存されます。これは.frmファイル内に保存されたテーブル定義の識別子とmysqlデータベース内の許可テーブルに保存された識別子に対応しています。MySQL5.1の許可テーブル内(そして他のテーブル)の文字列カラムの大きさは文字数でカウントされます。これは前バージョンのMySQLと違って、カラム内の値に充てる文字数を減らさずにマルチバイト文字を使用することができることを意味しています。

識別子を引用符で囲んだり、引用符を取り除くことができます。識別子が予約語、もしくは特殊文字を含む場合、 参照する時必ず引用符で囲まなければいけません。.(例外:修飾名内で点の後に続く語は識別子であるため、予約語であっても引用符で囲む必要はありません。)予約語のリストはこちらを参照してください。項8.3. 「MySQLでの予約語の扱い」.特殊文字とは、英数字の組み合わせであるキャラクタセット外の‘_’と‘$’になります。

識別子引用符文字は(‘`’)バッククォートです。

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

ANSI_QUOTESモードでMySQLを実行する場合は、識別子を囲む引用符として二重引用符も使用できます。

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax. (...)
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

注:ANSI_QUOTESモードは二重引用符を用いた文字列を識別子として解釈するため、このモードが実行されているとき文字列リテラルは一重引用符で囲まなければいけません。二重引用符は使用できません。

サーバSQLモードは項4.2.6. 「SQL モード」で表現されるように制御されています。

識別子が引用符で囲まれていれば識別子の引用符文字を識別子内に含むことができます。識別子内に含まれる文字が識別子を囲むのに使用している引用符と同じ場合、文字を二重にする必要があります。下記のステートメントはa`bというc"dカラムを含んだテーブルを作成します。

mysql> CREATE TABLE `a``b` (`c"d` INT);

識別子は1つのディジットで始まることもありますが、引用されない限りはディジットのみで構成されることはありません。

MおよびNは整数ですので、MeMeNといった形式名を使用することはお勧めできません。例:1e2e2を識別子として使用しないでください。これは、1e+3といった式があいまいになるためです。コンテキスト応じて、式1e + 3として、または数値1e+3として解釈される場合があります。

Bテーブルネーム名を作成するのにMD5()を使用する場合は注意が必要です。というのも、記述されたものがそのまま表現されてしまうといった、無効なフォーマットやあいまいなフォーマット名を作成する可能性があるからです。

8.2.1. 識別子の修飾語

MySQLでは、名前に単一識別子や複合識別子を使用することができます。構成が複数のパート名からなる場合、ピリオド(‘.’)文字で分割されなければなりません。複数パート名の頭文字は識別子として働き、最後尾の識別子が実行されているコンテキストに影響を与えます。

MySQLでは、次の形式のいずれかを使用してカラムを参照することができます。

カラム参照意味
col_nameこの名前のカラムが組み込まれたステートメントで使用されているテーブル内のカラムcol_name
tbl_name.col_nameデフォルトデータベースのテーブルtbl_name内のカラムcol_name
db_name.tbl_name.col_nameデータベースdb_nameのテーブルtbl_name内のカラムcol_name

複数のパート名からなる構成要素に引用符が必要な場合、名前全体を1つのものとして引用符で囲むのではなく、それぞれの名前を個別に引用符で囲んでください。例えば、`my-table.my-column`ではなく、`my-table`.`my-column`と記述してください。

対象となる参照があいまいな場合、ステートメント内のカラム参照の前にtbl_namedb_name.tbl_nameをつける必要があります。例えば、テーブルt1t2のそれぞれに同名のカラムcがあり、t1t2の両方を使用するSELECTステートメントでcを読み取るとします。この場合cは、ステートメントで使用されている 2 つのテーブル中で一意なカラムを表すものではなく、あいまいであるため、t1.cまたはt2.cと記述することによって、どちらのテーブルが対象か指定する必要があります。同様に、データベースdb1のテーブルtとデータベースdb2のテーブルtに含まれているカラムを取り出す場合は、それぞれのテーブルのカラムをdb1.t.col_namedb2.t.col_nameとして参照します。

修飾名でピリオドの後に続く語は識別子であるため、予約語であっても引用符で囲む必要はありません。

構文.tbl_nameはデフォルトデータベースのテーブルtbl_nameを意味します。この構文は ODBC との互換性を確保する目的で許容されています。これは、一部の ODBC プログラムでテーブル名の先頭に‘.’文字が付けられるためです。

8.2.2. 識別子の大文字/小文字区別

MySQL において、データベースはデータディレクトリ内のディレクトリに対応しています。データベース内の各テーブルも、データベースディレクトリ内の少なくとも1つ(記憶エンジンによってはそれ以上)のファイルに対応しています。そのため、ベースとなっているオペレーティングシステムで大文字と小文字が区別される場合、データベース名とテーブル名でも大文字と小文字が区別されます。つまり、Windows ではデータベース名とテーブル名で大文字と小文字は区別されず、ほとんどの種類の Unix では大文字と小文字が区別されることになります。ただし、重要な例外が 1 つあります。Mac OS X で、Unixをベースとしているがデフォルトの HFS+ ファイルシステムを使用している場合です。この場合は大文字と小文字が区別されません。しかし、Mac OS X は UFS ボリュームもサポートしています。UFS ボリュームでは Unix の場合と同じように Mac OS X でも大文字と小文字が区別されます。項1.8.4. 「SQL標準に対するMySQL拡張機能」を参照してください。このセクションに後述されているように、lower_case_table_namesシステム変数も、サーバがどのように識別子の大文字と小文字を区別するかということに影響を与えます。

:いくつかのプラットフォームでは、データベース名とテーブル名で大文字と小文字は区別されませんが、同じステートメント内で異なるケースを使用して同じデータベースやテーブルを参照しないようにしてください。次のステートメントでは、同じテーブルがmy_tableおよびMY_TABLEとして参照されています。したがって、このステートメントは機能しません。

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

カラム名、インデックス名、ストアされたルーチン名とカラムのエイリアスは、どのプラットフォームでも大文字と小文字が区別されません。トリガ名では大文字と小文字が区別されます。

デフォルトで、テーブルのエイリアスはUnixでは大文字と小文字が区別されますが、WindowsやMac OS Xでは区別されません。次のステートメントでは、同じエイリアスがaおよびAとして参照されています。したがって、このステートメントはUnixでは機能しません。

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

しかし、Windowsではこの同じステートメントが機能します。このような違いがプログラムに起こらないようにするために、常に小文字を使用してデータベースとテーブルを作成および参照するなどの一貫した規則を設けてください。この規則は最大限の軽便さと使いやすさのために推奨されています。

MySQLでのテーブルとデータベース名の保存方法はlower_case_table_namesシステム変数に影響されます。これはmysqld起動時に設定できます。 lower_case_table_namesは以下のテーブルに示された値をとり得ます。Unixでは、lower_case_table_namesのデフォルト値は 0で、Windowsでは1、Mac OS Xでは2となります。

意味
0CREATE TABLEもしくはCREATE DATABASEステートメントで区別された大文字/小文字を使用してテーブルとデータベース名が記憶されます。名前比較では大文字と小文字が区別されます。大文字/小文字を区別しないファイルシステム上で、--lower-case-table-names=0を用いて変数値を0にし、かつ大文字/小文字を混ぜてMyISAM テーブル名にアクセスした場合、インデックスデータが破壊される恐れがあるので注意してください。
1テーブル名はディスク上に小文字で記憶され、名前比較では大文字小文字は区別されません。MySQLでは、保管およびルックアップ時に全てのテーブル名が小文字に変換されます。このオプションはデータベース名やテーブルエイリアスにも適用されます。
2CREATE TABLEまたはCREATE DATABASEステートメントにおいて、テーブルとデータベース名は指定された大文字/小文字の形態でディスク上に記憶されますが、MySQLではルックアップ時に小文字に変換されます。名前比較では大文字と小文字が区別されません。:これは大文字小文字が区別されないファイルシステムでのみ機能します。InnoDBテーブル名はlower_case_table_names=1のように、小文字で記憶されます。

MySQLを単一プラットフォームでのみ使用している場合、通常はlower_case_table_names変数を変更する必要はありません。しかし、ファイルシステム上大文字小文字の区別方法が異なるプラットフォーム間でテーブルを移行させる場合、問題が生じる可能性があります。例えばUnix上で、my_tableMY_TABLEのように異なる2つのテーブル名を使用することはできますが、Windows上ではこれらは同一のものとして扱われます。データベースやテーブル名上の大文字/小文字に由来する移行問題を避けるには、2つのオプションがあります:

  • lower_case_table_names=1を全システムで使用してください。これの欠点は、SHOW TABLES またはSHOW DATABASESを使用した場合、元の大文字/小文字で区別された名前が見られないことです。

  • Unix上ではlower_case_table_names=0を、Windows上ではlower_case_table_names=2を使用してください。これでデータベースとテーブル名の大文字/小文字の区別が保存されます。これの欠点は、Windows上で、ユーザのステートメントがデータベースとテーブル名を参照するのに大文字/小文字が正しく区別されているかどうかを常に確認しなければならないことです。ステートメントをUnixに移行する際に大文字/小文字の区別がなされる場合、大文字/小文字が正確でなければ機能しません。

    例外::InnoDB テーブルを使用する場合、名前を強制的に小文字に変換するには、全てのプラットフォーム上でlower_case_table_namesを1に設定してください。

lower_case_table_namesシステム変数を1に設定する場合、新しい変数設定でmysqldを再起動する前に、まず旧データベースおよびテーブル名を小文字に変換しなければなりません。

バイナリ照合順序に応じて大文字形式が同値とみなされれば、オブジェクト名は複製として扱われます。これはカーソル名、状態名、機能名、プロシージャ名、保存ポイント、ルーチンローカル変数において当てはまります。しかしカラム名、制約条件、データベース、パーティション、PREPAREを使用して準備されたステートメント、テーブル、トリガ、ユーザ、そしてユーザによって定義された変数においては当てはまりません。

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ダブルバイトキャラクタセット内のキャラクタ値に一致します。

ウィンドウズ上では、nulprnauxなどの名前はデバイス名として保存されるため、ファイル名として使えません。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 — テーブル メンテナンスと修復プログラム」

8.2.4. 構文解析と解像度のファンクション名

MySQL 5.1ではビルトイン(既存の)ファンクション、ユーザによって定義されたファンクション(UDFs)、そして保存されたファンクションがサポートされます。このセクションでは、サーバが、ビルトインファンクション名をファンクション呼び出しもしくは識別子として認識するかどうか、また既存名によって異なる型のファンクションが存在する場合に、サーバがどのファンクションを使用するかを決定します。

ビルトインファンクション名の構文解析

パーサがビルトインファンクション名を解析するには、デフォルトルールにのっとって行われます。これらのルールはIGNORE_SPACE SQLモードを起動させることで変更できます。

構文解析中にビルトインファンクションの名前を認識した場合、その名前がファンクション呼び出しを意味しているのか、テーブルやカラム名といった識別子を導く非表現であるかどうかを決定します。例えば、次のステートメントではcountに対する最初のリファレンスはファンクション呼び出しであるのに対し、2番目リファレンスはテーブル名です。

SELECT COUNT(*) FROM mytable;
CREATE TABLE count (i INT);

表現を解析している時にのみ、パーサはビルトインファンクション名をファンクション呼び出しとして認識します。つまり非表現コンテキストでは、ファンクション名は識別子として許可されます。

しかし、ビルトインファンクションの中には特定の構文解析もしくは実装がなされることがあり、パーサはデフォルトで次のルールに沿って、名前がファンクション呼び出しか非表現コンテキストで識別子として使用されているかを区別します。

  • 表現名をファンクション呼び出しとして使用するには、名前と次の‘(’ 括弧文字

    の間に余白があってはいけません。

  • 逆に、ファンクション名を識別子として使用するには、括弧文字をすぐ後ろに続けてはいけません。

名前と括弧文字の間に余白のないファンクション呼び出しの記述が要求された場合、特定認識がおこなわれるビルトインファンクションにのみ適用されます。COUNTはそういった名前の1つです。後続の余白によって解釈が決定されるファンクション名の正確なリストは、sql/lex.hソースファイルのsql_functions[]配列に表示されます。MySQL 5.1以前ではそれらは多数(約200)あるため、余白のない要求を全ファンクション呼び出しに適応させる方法が最も簡単でしょう。MySQL 5.1では、パーサが改良され、影響を受けるファンクション名の数が約30におさえられています。

sql_functions[])配列にリストアップされていないファンクションには、余白は関係ありません。それらは表現コンテキスト内で使用される時のみファンクション呼び出しとして解釈され、それ以外では識別子として自由に使用されることもあります。ASCIIはそういった名前の1つです。しかし、こういった影響を受けないファンクション名に対する解釈は、表現コンテキストによって変わることがあります。func_name ()は単独で使用された場合、ビルトインファンクションと解釈されますが、単独ではない場合、func_name ()がユーザによって定義されたファンクションもしくは保存されたファンクションと解釈されます。

IGNORE_SPACE SQL モードでは、パーサがどのように余白が区別されるファンクション名を解釈するかを変更できます。

  • 名前と後続の括弧の間に余白がない場合、パーサは 無効IGNORE_SPACEを用いることで名前をファンクション呼び出しと解釈します。これはファンクション名が非表現コンテキストで使用されているときも発生します。

    mysql> CREATE TABLE count(i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax ...
    near 'count(i INT)'
    

    エラーを取り除き名前を識別子として扱われるようにするには、名前の後に続く余白を使うか、引用符で囲んだ識別子として書き記してください(あるいは両方)。

    CREATE TABLE count (i INT);
    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    
  • IGNORE_SPACEを有効にしているとき、パーサはファンクション名と後続の括弧間に余白が存在してはいけないという要求を緩和します。このことで、ファンクション呼び出しの記述がより自由に行えるようになります。例えば、次のどちらのファンクション呼び出しも有効です。

    SELECT COUNT(*) FROM mytable;
    SELECT COUNT (*) FROM mytable;
    

    しかし、IGNORE_SPACEを有効化することは、パーサが影響を受けるファンクション名を予約語として扱うという副作用もあります。(項8.3. 「MySQLでの予約語の扱い」を参照してください)これは名前の後に続く余白には識別子として認識されないことを意味します。後続の余白の有無を問わず、名前はファンクション呼び出しとして使用できますが、引用符で囲まれない場合は、非表現テキスト内での構文エラーを引き起こします。例えば、IGNORE_SPACEを有効化した場合、パーサがcountを予約語として扱うため、構文エラーが生じ、両方の後続ステートメントが無効になります。

    CREATE TABLE count(i INT);
    CREATE TABLE count (i INT);
    

    非表現コンテキストでファンクション名を使用するには、引用符で囲まれた識別子として記述してください。

    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    

IGNORE_SPACE SQL モードを有効化するには、このステートメントを使用してください。

SET sql_mode = 'IGNORE_SPACE';

IGNORE_SPACEANSIのような値に含まれるコンポジットモードでも有効化されます。

SET sql_mode = 'ANSI';

どのコンポジットモードがIGNORE_SPACEを有効化するかを調べるには項4.2.6. 「SQL モード」を参照してください。

IGNORE_SPACE設定におけるSQLコードの依存性を最小化するには、これらのガイドラインを使用してください。

  • UDFもしくはビルトインファンクションと同名の保存ファンクション作成を避けてください。

  • 非表現コンテキスト内のファンクション名使用を避けてください。例えば、これらのステートメントはcount (IGNORE_SPACEに影響を受けるファンクション名のひとつ)を使用するため、IGNORE_SPACE が有効であれば後続名に対する余白の有無によらず、これらは無効となります。

    CREATE TABLE count(i INT);
    CREATE TABLE count (i INT);
    

    非表現コンテキストでファンクション名を使用するには、引用符で囲まれた識別子として記述してください。

    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    

IGNORE_SPACEに影響を受けるファンクション名の数はMySQL 5.1.13では約200から約30に抑えられ、MySQL 5.1.13からは、下記のファンクションのみIGNORE_SPACE設定に影響を受けます。

ADDDATEBIT_ANDBIT_OR
BIT_XORCASTCOUNT
CURDATECURTIMEDATE_ADD
DATE_SUBEXTRACTGROUP_CONCAT
MAXMIDMIN
NOWPOSITIONSESSION_USER
STDSTDDEVSTDDEV_POP
STDDEV_SAMPSUBDATESUBSTR
SUBSTRINGSUMSYSDATE
SYSTEM_USERTRIMVARIANCE
VAR_POPVAR_SAMP 

MySQLの前バージョンでは、sql/lex.hソースファイルのsql_functions[]配列の内容を確認して、どのファンクションがIGNORE_SPACEに影響を受けるかをチェックしてください。

非互換性に関する警告:MySQL 5.1.13ではIGNORE_SPACEの影響を受けるファンクション名の数を抑えることでパーサオペレーションに一貫性をもたらしました。ただし、次の条件に依存する旧SQLコードの非互換性の可能性も生じます

  • IGNORE_SPACEは無効化されています。

  • ファンクション名に続く余白の有無は、同名を持つビルトインファンクションと保存ファンクション(例:PI()PI ())を区別するのに用いられます。

MySQL 5.1.13より後でIGNORE_SPACEに影響を受けないファンクションに対しては、その方法は機能しません。前置の非互換性に対応するコードがある場合は、次のうちどちらのアプローチも使えます。

  • 保存ファンクションにビルトインファンクションとコンフリクトを引き起こす名前が存在する場合、余白の有無にかかわらず、修飾語付随のスキーマ名を持つ保存ファンクションを参照してください。例えば、schema_name.PI()またはschema_name.PI ()と書いてください。

  • また、保存ファンクション名を、コンフリクトを引き起こさない名前に付け替え、新しい名前を使用するためにファンクションの起動を変更してください。

ファンクション名の解像度

次のルールはファンクション作成と起動のためにサーバがどのようにファンクション名を参照するかについて述べられています。

  • ビルトインファンクションとユーザによって定義されたファンクション

    MySQL 5.1.14より後では、ビルトインファンクションと同名のUDFを作成する際に、エラーが発生します。5.1.14前では、UDFはビルトインファンクションと同名で作成はできましたが、パーサがビルトインファンクションを参照するファンクションの起動を解除するため、UDFの起動はできませんでした。例えば、ABSと名づけられたUDFを作成する場合、ABS()を参照するとビルトインファンクションが起動されます。

  • ビルトインファンクションと保存ファンクション

    ビルトインファンクションと同名の保存ファンクションを作成することは可能ですが、保存ファンクションを起動させるにはスキーマ名で資格を与えなければいけません。例えば、testスキーマ内でPIという名の保存ファンクションを作成する場合、サーバがPI()をビルトインファンクション参照として解釈するため、test.PI()として起動されます。5.1.14より、保存ファンクション名がビルトインファンクション名と衝突する場合、サーバから警告が発せられます。この警告はSHOW WARNINGSで表示できます。

  • ユーザによって定義されたファンクションと保存ファンクション

    ユーザによって定義されたファンクションと保存ファンクションは同じネームスペースを共有します。したがって、同名でUDFと保存ファンクションを作成することはできません。

前置ファンクション名を解除するには、新しいビルトインファンクションを実行するためのMySQLバージョンアップグレードを実行してください。

  • すでにユーザによって定義されたファンクションが提供名で作成され、同名の新ビルトインファンクションが実行されるようにMySQLがアップグレードされた場合、UDFはアクセス不可となります。これを修正するには、DROP FUNCTIONを使用してUDFを無効にし、次にCREATE FUNCTIONを使ってコンフリクトを引き起こさないような異なる名前でUDFを再作成してください。

  • MySQLの新バージョンで、既存の保存ファンクションと同名のビルトインファンクションを起動する場合、2つの方法があります。コンフリクトを引き起こさないように保存ファンクション名を変えるか、スキーマ修飾語が使用されるよう、ファンクションの呼び名を変えてください。(つまり、schema_nameまたはfunc_name()構文を使用してください。)

8.3. MySQLでの予約語の扱い

SELECTDELETE、もしくはBIGINTといった特定語はテーブルやカラム名といった識別子として使用するために予約されており、特別扱いを受けます。ビルトインファンクション名に対しても同様のことが言える場合があります。

項8.2. 「識別子」を記述するのに予約語を引用符で囲む場合、その予約語は識別子として許可されます。

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax ...
near 'interval (begin INT, end INT)'

mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)

例外:修飾名で点の後に続く語は識別子のため、予約語でも引用符で囲む必要はありません。

mysql> CREATE TABLE mydb.interval (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)

ビルトインファンクション名は識別子として許可されますが、識別子として使用する場合は注意してください。例えば、COUNTはカラム名として許可されます。しかし、デフォルトでは、ファンクション名と後続の‘(’文字間のファンクション起動では余白は許可されていません。この条件では、ファンクション呼び出しもしくは非ファンクションコンテキストで名前が使用されているかどうかを、パーサが区別するのを許可します。ファンクション名の認識についてより詳しく知りたい場合は次を参照してください。項8.2.4. 「構文解析と解像度のファンクション名」

次のテーブルに記された語はMySQL上で明確に予約されています。5.1今後バージョンアップする時のことを考慮に入れて、使用予定のある予約語を参照してみましょう。MySQLのバージョンアップ後もカバーするマニュアルではこれらを確認できます。テーブル内のたいていの語は標準SQLでカラムもしくはテーブル名としては許可されません(例:GROUP)。MySQLがyaccパーサを使用、必要とするために、予約されている語もあります。予約語は引用符で囲まれた場合、識別子として使用できます。

ACCESSIBLEADDALL
ALTERANALYZEAND
ASASCASENSITIVE
BEFOREBETWEENBIGINT
BINARYBLOBBOTH
BYCALLCASCADE
CASECHANGECHAR
CHARACTERCHECKCOLLATE
COLUMNCONDITIONCONSTRAINT
CONTINUECONVERTCREATE
CROSSCURRENT_DATECURRENT_TIME
CURRENT_TIMESTAMPCURRENT_USERCURSOR
DATABASEDATABASESDAY_HOUR
DAY_MICROSECONDDAY_MINUTEDAY_SECOND
DECDECIMALDECLARE
DEFAULTDELAYEDDELETE
DESCDESCRIBEDETERMINISTIC
DISTINCTDISTINCTROWDIV
DOUBLEDROPDUAL
EACHELSEELSEIF
ENCLOSEDESCAPEDEXISTS
EXITEXPLAINFALSE
FETCHFLOATFLOAT4
FLOAT8FORFORCE
FOREIGNFROMFULLTEXT
GRANTGROUPHAVING
HIGH_PRIORITYHOUR_MICROSECONDHOUR_MINUTE
HOUR_SECONDIFIGNORE
ININDEXINFILE
INNERINOUTINSENSITIVE
INSERTINTINT1
INT2INT3INT4
INT8INTEGERINTERVAL
INTOISITERATE
JOINKEYKEYS
KILLLEADINGLEAVE
LEFTLIKELIMIT
LINEARLINESLOAD
LOCALTIMELOCALTIMESTAMPLOCK
LONGLONGBLOBLONGTEXT
LOOPLOW_PRIORITYMASTER_SSL_VERIFY_SERVER_CERT
MATCHMEDIUMBLOBMEDIUMINT
MEDIUMTEXTMIDDLEINTMINUTE_MICROSECOND
MINUTE_SECONDMODMODIFIES
NATURALNOTNO_WRITE_TO_BINLOG
NULLNUMERICON
OPTIMIZEOPTIONOPTIONALLY
ORORDEROUT
OUTEROUTFILEPRECISION
PRIMARYPROCEDUREPURGE
RANGEREADREADS
READ_ONLYREAD_WRITEREAL
REFERENCESREGEXPRELEASE
RENAMEREPEATREPLACE
REQUIRERESTRICTRETURN
REVOKERIGHTRLIKE
SCHEMASCHEMASSECOND_MICROSECOND
SELECTSENSITIVESEPARATOR
SETSHOWSMALLINT
SPATIALSPECIFICSQL
SQLEXCEPTIONSQLSTATESQLWARNING
SQL_BIG_RESULTSQL_CALC_FOUND_ROWSSQL_SMALL_RESULT
SSLSTARTINGSTRAIGHT_JOIN
TABLETERMINATEDTHEN
TINYBLOBTINYINTTINYTEXT
TOTRAILINGTRIGGER
TRUEUNDOUNION
UNIQUEUNLOCKUNSIGNED
UPDATEUSAGEUSE
USINGUTC_DATEUTC_TIME
UTC_TIMESTAMPVALUESVARBINARY
VARCHARVARCHARACTERVARYING
WHENWHEREWHILE
WITHWRITEXOR
YEAR_MONTHZEROFILL 

以下はMySQL 5.1で登場する新規の予約語です。

ACCESSIBLELINEARMASTER_SSL_VERIFY_SERVER_CERT
RANGEREAD_WRITE 

MySQLでは、引用符で囲まれてない識別子をキーワードとして使用できますが、これは多くのユーザが以前から使用していたからです。下記リストに例を記します。

  • ACTION

  • BIT

  • DATE

  • ENUM

  • NO

  • TEXT

  • TIME

  • TIMESTAMP

8.4. ユーザによって定義された変数

ユーザによって定義された変数に値を保存し、後で参照することができます。これで1つのステートメントから次のステートメントに変数を移行させることができます。ユーザによって定義された変数はコネクションを指定しています。.つまり、1クライアントによって定義されたユーザ変数は他のクライアントには確認や使用ができません。特定のクライアント接続で使用されている全ての変数は、クライアントが接続を切ったときに自動的に開放されます。

ユーザ変数は@var_nameとして記述され、このとき変数名var_nameは現キャラクタセット、.’、‘_’そして‘$’からなる英数字で構成される場合があります‘。デフォルトキャラクタセットはlatin1(cp1252西ヨーロッパ言語)です。これは--character-set-serverオプションでmysqldに変換されることがあります。項4.10.1. 「データおよびソート用キャラクタ セット」を参照してください。ユーザ変数名を文字列や識別子として引用符で囲む場合、他の文字を含むことができます(例: @'my-var'@"my-var"または@`my-var`)。

注:MySQL5.0前ではユーザ変数名は大文字と小文字が区別され、MySQL 5.0以降は区別されません。

ユーザによって定義された変数を設定する方法の1つに、SETステートメントを発行する方法が挙げられます。

SET @var_name = expr [, @var_name = expr] ...

SETでは、=もしくは:=のどちらかが代入演算子として使用できます。各々の変数に割り当てられたexprは整数、実数、文字列、もしくはNULL値を評価できます。しかし、結果セットで変数値が選択された場合、文字列としてクライアントに返されます。

SET以外のステートメントで、ユーザ変数に値を割り当てることもできます。この場合、代入演算子は:=でなくてはならず、=ではありません。これは= が非SET ステートメンとに置いて比較オペレータとして扱われるからです。

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

ユーザ変数は表現が許可されているコンテキストで使用される可能性があります。これには現在、リテラル値を明確に要求するコンテキストは含まれません。例えばSELECTステートメントのLIMIT 節や、LOAD DATA ステートメントのIGNORE N LINES節になります。

ユーザ変数が文字値を割り当てられた場合、それは文字列と同じキャラクタセットと照合順序になります。ユーザ変数の強制力は絶対です。(これはテーブルカラム値と同等の強制力です。)

:SELECTステートメントでは、クライアントに送信されたときのみ表現がそれぞれ評価されます。これはつまり、HAVINGGROUP BYもしくはORDER BY節において、SELECTリストに設定された変数を含む表現を参照できないことを意味します。.例えば、次のステートメントは期待通りには機能しません

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;

HAVING 節でのbに対する参照は、@aaを使用したSELECTリスト内の表現に対応するエイリアスを参照します。これは期待通りには機能しません。@aaは以前選択された行のid値を含み、現在の行から選択された値は含みません。

ユーザ変数の評価順序は定義されておらず、与えられたクエリ内の要素に基づいて変更されることがあります。SELECT @a, @a := @a+1 ...では、MySQLは@aを先に評価し次に割り当てが実行されるように見えますが、クエリの変更(例えばGROUP BYHAVINGまたはORDER BY節による変更)は評価順序を変更する可能性があります。

基本的なルールは、ステートメントの一部でユーザ変数値を割り当てないことおよび同一ステートメント内の他部分で同じ変数を使用しないことです。期待通りの結果を得られるかもしれませんが、これは確約されていません。

変数の設定および同ステートメント内での使用における他の問題点は、変数のデフォルト結果型がステートメントが開始時の変数型に基づく点です。次の例で説明します。

mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;

このSELECTステートメントに対して、MySQLでは、カラム1は文字列であり、@aから文字列への全てのアクセスを変換することがクライアントに通知されます。これは、@a が2行目では数値に設定されていても行われます。SELECTステートメント実行後、@aは次のステートメントの数値として認識されます。

この問題を避けるためには、単一ステートメント内で、同変数を設定・使用してはいけません。また、変数の使用前に型を定義するために、00.0もしくは''に変数を設定してもいけません。

初期化されていない変数を参照する場合、それはNULL値および文字列の型が存在します。

8.5. コメント構文

MySQL サーバでは、3つのコメントスタイルをサポートしています。

  • #’文字から行末まで続く。

  • -- ’シーケンスから行末まで続く。MySQLでは ‘-- ’ (ダッシュ2つ)のコメントスタイルでは、2 つ目のダッシュの後にスペースを 1 つ以上挿入する必要があることに注意してください。(例えば スペース、タブ、新しい行など。)項1.8.5.7. 「コメントの開始記号としての'--'」で述べられたとおり、この構文は標準SQLコメント構文とは少し異なります。

  • C プログラミング言語のように/*シーケンスから続く*/シーケンスへ。開始および終了シーケンスが同行にある必要がないため、この構文は複数行にわたってコメントされることが許可されます。

次の例では3つ全てのコメントスタイルが説明されます。

mysql> SELECT 1+1;     # This comment continues to the end of line
mysql> SELECT 1+1;     -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;

MySQL サーバではC-スタイルコメントの変形がいくつかサポートされています。これらはMySQL拡張を含むコードを記述することを可能にしますが、次のコメント形式を使用することで移行性を保持します。

/*! MySQL-specific code */

この場合、MySQLサーバは構文解析し、他のSQLステートメントのようにコメント内でのコードを実行しますが、他のSQLサーバはその拡張を認識しません。例えば、MySQL サーバは次のステートメント内でSTRAIGHT_JOINキーワードを認識しますが、他のサーバーは認識しません。

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...

!’文字の後にバージョン番号を追加する場合、コメント内構文はMySQLバージョンが特定のバージョン番号と同等かそれ以上の場合にのみ実行されます。次のコメント内のTEMPORARYキーワードはMySQL 3.23.02もしくはそれ以降のサーバでのみ実行されます。

CREATE /*!32302 TEMPORARY */ TABLE t (a INT);

記述されたコメント構文はmysqldサーバによるSQLステートメントの構文解析に適用されます。mysqlクライアントプログラムはサーバに送信する前に、一部ステートメントの構文解析もします。(これは複数ステートメント入力行で、ステートメント境界表現を決定するために行われます。)


powered by SEO.CUG.NET