MySQL道普請便り

第67回 SQLモードについて[その3]

この記事を読むのに必要な時間:およそ 4 分

「第18回 MySQL5.7のデフォルトのSQLモードを確認してみる」「第60回 SQLモードについて[その1]⁠「第64回 SQLモードについて[その2]⁠と,SQLモードについて3回にわたって紹介してきました。今回も引き続きSQLモードについて説明していきます。

SQLモードの設定方法や変更の方法は第60回ですでに説明を行っているので,改めて説明を行いません。

ANSI_QUOTES

MySQLの予約語を識別子(テーブル名やカラム名などを指します)として利用したい場合もあるかと思います。そういった場合に,その文字列を通常は`(バッククオート)記号で囲むことで,予約語ではなく識別子として扱うことができます。

このSQLモードを有効にすると`記号以外にも,"(ダブルクオート)記号でも同様の事ができるようになります。

まず,MySQLの予約語をカラムにしたい場合を考えます。たとえば,selectという名前のTEXT型のカラムを作成する場合を考えます。通常通りに作成を行うと,以下のようにエラーになってしまいます。

mysql> SET SESSION sql_mode='';
mysql> create table test (select TEXT);
ERROR 1054 (42S22): Unknown column 'TEXT' in 'field list'

続けて,`記号で囲った場合の処理を確認してみます。こちらは以下のようにテーブルが作成されていることがわかります。

mysql> create table test (`select` TEXT);

mysql> show create table test;
+-------+----------------------------------------------------------------------------+
| Table | Create Table                                                               |
+-------+----------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `select` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

現在SQLモードには何も設定がされていない状態で,今度は"記号を使ってテーブルを作成してみようと思います。先ほど作成したテーブルを削除してから,テーブルを作成します。

mysql> drop table test;

mysql> create table test ("select" TEXT);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"select" TEXT)' at line 1

このように構文エラーとなってしまいました。続いてSQLモードにANSI_QUOTESを設定して試してみます。

mysql> SET SESSION sql_mode='ANSI_QUOTES';

mysql> create table test ("select" TEXT);
Query OK, 0 rows affected (0.04 sec)

mysql> show create table test;
+-------+----------------------------------------------------------------------------+
| Table | Create Table                                                               |
+-------+----------------------------------------------------------------------------+
| test  | CREATE TABLE "test" (
  "select" text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

このように,作成することができました。ここで気になるのは,show create table文の中で"select"となっている部分でSQLモードが変更となった場合にどうなってしまうのかですが,以下のようにSQLモードを元に戻した場合`記号に置き換わり,問題は起こりません。

mysql> SET SESSION sql_mode='';

mysql> show create table test;
+-------+----------------------------------------------------------------------------+
| Table | Create Table                                                               |
+-------+----------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `select` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

このモードの使いどころとしては,他のDBを利用して作成したコードをMySQLに移植したい場合などに,用意したコードを変更せずとも対応できるという点にあります。またこのモードを使用すると,"で囲われた文字列は文字列として使用することが出来ないので注意が必要です。

mysql> SET SESSION sql_mode='';

mysql> select "test";
+------+
| test |
+------+
| test |
+------+
1 row in set (0.00 sec)

mysql> SET SESSION sql_mode='ANSI_QUOTES';

mysql> select "test";
ERROR 1054 (42S22): Unknown column 'test' in 'field list'

著者プロフィール

木村浩一郎(きむらこういちろう)

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170

コメント

コメントの記入