16

我创建了一个表如下:

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

那么,我可以在表名中使用特殊字符!&?如果是,那么我可能必须以某种方式对它们进行编码?

谢谢。

4

7 回答 7

25

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

INSERT INTO `e!` ...

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

于 2012-05-04T05:24:37.407 回答
12

根据文档,您不能:

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

  • 不带引号的标识符中允许的字符: ASCII:[0-9,az,AZ$_](基本拉丁字母,数字 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

于 2012-05-04T05:22:18.120 回答
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
于 2012-05-04T05:25:29.093 回答
2

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

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

于 2012-05-04T05:32:08.753 回答
0

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

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

于 2012-05-04T05:29:48.550 回答
0

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

ASCII:[0-9,az,AZ$_](基本拉丁字母,数字 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

于 2019-05-22T11:42:59.977 回答
-1

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

于 2012-05-04T05:33:27.490 回答