2009-08-27 17 views
1

MySQLの認定ガイドの例の質問から...MySQLの識別子質問

質問

Will the following SQL statement succeed or result in an error? Assume that the table to be created doesn't already exist. 

CREATE TABLE MD5 (id INT);

答え

The statement results in an error if the IGNORE_SPACE SQL mode is enabled. In that case, all function names become reserved words and the statement would return an error because MD5 is a function name. 

If the IGNORE_SPACE SQL mode is not enabled, the statement succeeds: 

mysql> CREATE TABLE MD5 (id INT); 
Query OK, 0 rows affected 


Note that the IGNORE_SPACE SQL mode is part of the ANSI SQL mode.

は、なぜ彼らは、スペースについて話していますか?誰でも知っている?正解は何でしょうか?関数が予約語なので失敗しますか?引用されると成功しますか?バックティックと...そう?

答えて

2

IGNORE_SPACE modeは、関数名と次のかっこの間のスペースを許可します。有効になっていると、すべての関数名が予約語になります。これは、MySQLが関数を呼び出すか、識別子を宣言(使用)するかをMySQLが判断できなくなるためです。それが有効になっている場合

したがって、あなたのCREATE TABLEは失敗し、次のよう

SELECT MD5 (some_column) FROM some_table 

は動作します。 IGNORE_SPACEが無効になっている場合、逆の動作が行われます(CREATE TABLEが機能し、SELECTより大きい場合は機能名とカッコの間にスペースがあるため)。

0

IGNORE_SPACEはポテンシャル関数名と(

Mysql's manual page on function resolution explains it all間のスペースを無視しますが、ここではショートバージョンです:

SELECT md5(colum1) FROM table; 

がcolum1にMD5関数を適用しますが。 IGNORE_SPACEがcolum1に、有効になっている場合

SELECT md5 (colum1) FROM table; 

は、MD5関数を適用します。 IGNORE_SPACEがオフになっている

場合はそこにスペースがありますので、「MD5(」、関数呼び出しとして扱われません。

バッククォートを置くことは単語が関数名が、いくつかのデータベース、テーブルでMysqlのないものになります、列などの識別子