如何转义用作列名的保留字? MySQL /创build表

我从.NET中的类生成表,一个问题是类可能有一个字段名称key是一个保留的MySQL关键字。 如何在create table语句中转义它? (注:下面的其他问题是文本必须是一个固定的大小被索引/唯一)

 create table if not exists misc_info ( id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, key TEXT UNIQUE NOT NULL, value TEXT NOT NULL)ENGINE=INNODB; 

如果启用ANSI SQL模式,则可以使用双引号

 CREATE TABLE IF NOT EXISTS misc_info ( id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, "key" TEXT UNIQUE NOT NULL, value TEXT NOT NULL ) ENGINE=INNODB; 

或专有的后退勾号转义。 (在这个答案中涵盖了哪里可以find各种键盘布局上的字符)

 CREATE TABLE IF NOT EXISTS misc_info ( id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, `key` TEXT UNIQUE NOT NULL, value TEXT NOT NULL ) ENGINE=INNODB; 

(来源: MySQL参考手册,9.3保留字 )

你应该使用反标号(`),例如:

 create table if not exists misc_info ( id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, `key` TEXT UNIQUE NOT NULL, value TEXT NOT NULL)ENGINE=INNODB; 

如果您对不同SQL服务器之间的可移植性感兴趣,则应使用ANSI SQL查询。 在ANSI SQL中转义string是通过使用双引号(“)来完成的。不幸的是,这种转义方法不能移植到MySQL,除非它被设置为ANSI兼容模式。

就我个人而言,我总是用–sql-mode ='ANSI'参数启动我的MySQL服务器,因为这允许两种方法转义。 如果您正在编写将在MySQL服务器中执行的查询,而这个MySQL服务器没有设置/由您控制,那么您可以执行以下操作:

  • 在ANSI SQL中编写所有的SQL查询
  • 在下面的MySQL特定查询中将它们括起来:

     SET @OLD_SQL_MODE=@@SQL_MODE; SET SESSION SQL_MODE='ANSI'; -- ANSI SQL queries SET SESSION SQL_MODE=@OLD_SQL_MODE; 

这样,唯一的MySQL特定的查询就在你的.sql脚本的开头和结尾。 如果你为不同的服务器发货,只要删除这3个查询,你就全部设置好了。 更方便的是,您可以创build一个名为script_mysql.sql的脚本,其中包含上述模式设置查询,获取script_ansi.sql脚本并重置模式。