【问题标题】:How do I escape reserved words used as column names? MySQL/Create Table如何转义用作列名的保留字? MySQL/创建表
【发布时间】:2021-05-24 12:02:25
【问题描述】:

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

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 escaping


    【解决方案1】:

    对于 CosmosDB SQL,您可能想要使用

    SELECT item["RESERVED_KEY"] FROM ...
    

    【讨论】:

      【解决方案2】:

      如果启用了ANSI SQL mode,则可以使用双引号

      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; 
      

      或专有的反勾号以其他方式转义。 (this answer 中介绍了在各种键盘布局中何处可以找到 ` 字符)

      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 Reference Manual, 9.3 Reserved Words

      【讨论】:

      • 恕我直言,您应该始终引用所有字段名和表名。
      • @rjmunro - 这样做更具防御性,因为它可以保护您免受更高版本中引入的新保留关键字的影响,但我不喜欢视觉上的混乱。
      • 同样的修复(双引号转义)也适用于 Cassandra 的 CQL 中的关键字。 有点跑题了,我知道,但这个话题出现在 Cassandra 特定的搜索中。
      • MySQL 参考手册链接目前已损坏。实际链接:dev.mysql.com/doc/refman/5.7/en/keywords.html
      【解决方案3】:

      如果您对不同 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;
        

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

      【讨论】:

        【解决方案4】:

        您应该使用反引号字符 (`) 例如:

        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;
        

        【讨论】:

          猜你喜欢
          • 2018-02-03
          • 1970-01-01
          • 2020-06-12
          • 1970-01-01
          • 2022-08-13
          • 1970-01-01
          • 1970-01-01
          • 2011-03-22
          相关资源
          最近更新 更多