MySQL表名中的特殊字符

时间:2012-05-04 05:17:15

标签: mysql sql

我按如下方式创建了一个表:

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中的特殊字符。我试图逃避它,但查询仍然失败。

那么,我可以在表名中添加!&等特殊字符吗?如果是,那么我可能不得不以某种方式对它们进行编码?

感谢。

7 个答案:

答案 0 :(得分:19)

引用您的含糊不清或“特殊”的表名,后面有一个勾号:

INSERT INTO `e!` ...

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

答案 1 :(得分:12)

根据文档,你不能:

  

标识符在内部转换为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

答案 2 :(得分:4)

试试这个:

    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

答案 3 :(得分:1)

如果您对表标识符有任何特殊要求,则表示您的数据库体系结构存在问题和/或了解数据库体系结构。

您最好纠正这些架构错误,而不是强制执行愚蠢的标识符

答案 4 :(得分:0)

你需要在e周围回溯!

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

答案 5 :(得分:0)

  

未加引号的标识符中允许的字符:

     

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

答案 6 :(得分:-1)

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