【问题标题】:Special Characters in MySQL Table NameMySQL 表名中的特殊字符
【发布时间】:2012-05-04 05:17:15
【问题描述】:

我创建了一个表如下:

CREATE TABLE IF NOT EXISTS 'e!' (
`aa` int(11) unsigned NOT NULL auto_increment,
`showName` TEXT NOT NULL default '',
`startDateTime` DATETIME NOT NULL default '',
`endDateTime` DATETIME NOT NULL default '',
PRIMARY KEY  (`aa`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

然后尝试用查询插入:

INSERT INTO e! (showname, startDateTime, endDateTime) VALUES('E! News ', '2012-05-03 19:00:00', '2012-05-03 20:00:00')

由于表名中的! 导致错误,我假设! 是mysql 中的特殊字符。我试图逃避它,但查询仍然失败。

那么,我可以在表名中包含!& 之类的特殊字符吗?如果是,那么我可能必须以某种方式对其进行编码?

谢谢。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    用反引号引用您的模棱两可或“特殊”的表名:

    INSERT INTO `e!` ...
    

    或者更好的是,不要在表名中使用特殊字符以避免此类问题。

    【讨论】:

      【解决方案2】:

      根据文档,您不能:

      标识符在内部转换为 Unicode。它们可能包含 这些字符:

      • 不带引号的标识符中允许的字符: ASCII:[0-9,a-z,A-Z$_](基本拉丁字母,数字 0-9,美元,下划线) 扩展:U+0080 ..U+FFFF

      • 带引号的标识符中允许的字符包括完整的 Unicode 基本多语言平面 (BMP),但 U+0000 除外: ASCII:U+0001 .. U+007F 扩展:U+0080 ..U+FFFF

      来源:http://dev.mysql.com/doc/refman/5.5/en/identifiers.html

      【讨论】:

        【解决方案3】:

        试试这个:

            CREATE TABLE IF NOT EXISTS `e!` (
        `aa` int(11) unsigned NOT NULL auto_increment,
        `showName` TEXT NOT NULL default '',
        `startDateTime` DATETIME NOT NULL ,
        `endDateTime` DATETIME NOT NULL ,
        PRIMARY KEY  (`aa`)
        ) ENGINE=MyISAM  DEFAULT CHARSET=utf8
        

        【讨论】:

          【解决方案4】:

          如果您对表标识符有任何特殊要求,这意味着您的数据库架构和/或对数据库架构的理解存在问题。

          你最好纠正这些架构错误,而不是强制使用愚蠢的标识符

          【讨论】:

          • 我绝对同意最好不要在表名中使用奇怪的标识符,我知道我可以轻松地将特价映射到另一个有效的字符串。
          • LOL @peasant13337 你没有明白这一点。无论伪装与否,它们都应该没有需要。你只是不明白这些标识符的用途
          【解决方案5】:

          您需要在 e! 周围加上反引号!

          此外,您的datetimes 需要解析为datetime 的默认值。

          【讨论】:

            【解决方案6】:

            不带引号的标识符中允许的字符:

            ASCII:[0-9,a-z,A-Z$_](基本拉丁字母,数字 0-9,美元, 下划线)

            扩展:U+0080 .. U+FFFF

            带引号的标识符中允许的字符包括完整的 Unicode 基本多语言平面 (BMP),U+0000 除外:

            ASCII:U+0001 .. U+007F

            扩展:U+0080 .. U+FFFF

            ASCII NUL (U+0000) 和补充字符(U+10000 及更高) 不允许在带引号或不带引号的标识符中使用。

            标识符可以以数字开头,但除非被引用,否则可能不包含 仅由数字组成。

            数据库、表和列名不能以空格字符结尾。

            来源:https://dev.mysql.com/doc/refman/8.0/en/identifiers.html

            【讨论】:

              【解决方案7】:

              这是Object Names MySQL的标准。根据它你不能使用“!”符号作为表名的一部分。

              猜你喜欢
              • 1970-01-01
              • 2010-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多