作者:俊达
在 MySQL 中,标识符是指数据库、表名、列名等的名称。默认情况下,MySQL 使用反引号 (`) 来引用标识符。当使用 MySQL 的关键字或者特殊字符作为表名或列名时,可以使用反引号 (`)来避免语法错误。然而,MySQL 提供了一个 SQL 模式——ANSI_QUOTES ,它可以改变标识符引号的行为。不设置ANSI_QUOTES时,MySQL可以使用双引号来引用字符串常量。而设置ANSI_QUOTES后,双引号 (") 内的内容不再是字符串,而是MySQL的标识符(如表名、字段名)。这样做的好处是,可以更容易地将 SQL 语句与其他数据库系统的语法进行兼容,因为在 ANSI SQL 中,双引号是用于引用标识符的常用方法。
下面是一个示例,说明了这两种情况的区别:
不设置ANSI_QUOTES
mysql> set sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
-- order是关键字,不能作为表名
mysql> create table order(a varchar(100));
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 'order(a int)' at line 1
mysql> create table "order"(a varchar(100));
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 '"order"(a int)' at line 1
-- 使用反引号(``),
mysql> create table `order`(a varchar(100));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into `order` values("abc");
Query OK, 1 row affected (0.00 sec)
mysql> select * from `order`;
+------+
| a |
+------+
| abc |
+------+
1 rows in set (0.00 sec)
设置ANSI_QUOTES
mysql> drop table `order`;
Query OK, 0 rows affected (0.00 sec)
-- 设置ANSI_QUOTES
mysql> set sql_mode='ANSI_QUOTES';
Query OK, 0 rows affected (0.00 sec)
-- 使用双引号
mysql> create table "order"(a varchar(100));
Query OK, 0 rows affected (0.02 sec)
-- "abc" 不是合法的字符串表达式, 而是字段abc
mysql> insert into "order" values ( "abc");
ERROR 1054 (42S22): Unknown column 'abc' in 'field list'
-- 这里插入的"a"不是字符串a,而是字段a
mysql> insert into "order" values ( "a");
Query OK, 1 row affected (0.01 sec)
mysql> select * from "order";
+------+
| a |
+------+
| NULL |
+------+
总之,该设置主要用于处理标识符的引用问题,以确保 MySQL 正确解释和执行 SQL 语句。根据实际需要,可以选择使用反引号或设置 ANSI_QUOTES 模式,以便更好地处理标识符的引用。
更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw