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

135 mysql escaping

我从.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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 175

如果启用了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; 
Run Code Online (Sandbox Code Playgroud)

或者专有的后退剔除否则.(`这个答案中介绍了在各种键盘布局上找到字符的位置)

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; 
Run Code Online (Sandbox Code Playgroud)

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

  • @rjmunro - 这样做更具防御性,因为它可以保护你免受后来版本中引入的新保留关键字的影响,但我不喜欢视觉混乱. (9认同)
  • 恕我直言,你应该始终引用所有字段名称和表名称. (5认同)

小智 69

您应该使用返回刻度字符(`),例如:

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;
Run Code Online (Sandbox Code Playgroud)


小智 15

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

就个人而言,我总是使用--sql-mode ='ANSI'参数启动我的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;
    
    Run Code Online (Sandbox Code Playgroud)

这样,唯一的MySQL特定查询位于.sql脚本的开头和结尾.如果您要为不同的服务器发送它们,只需删除这3个查询即可.更方便的是,您可以创建一个名为:script_mysql.sql的脚本,该脚本将包含上述模式设置查询,获取script_ansi.sql脚本并重置模式.