为啥这个 MySQL CREATE TABLE 语句失败?
Posted
技术标签:
【中文标题】为啥这个 MySQL CREATE TABLE 语句失败?【英文标题】:Why is this MySQL CREATE TABLE statement failing?为什么这个 MySQL CREATE TABLE 语句失败? 【发布时间】:2020-09-16 19:33:09 【问题描述】:此创建语句失败,我看不出原因。 mysql 报告:
错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
objObjectType
VARCHAR(100)”附近使用正确的语法*
CREATE TABLE `my_object_attribute_map` (
`objID` INT(10) UNSIGNED auto_increment NOT NULL primary key,
`objForeignKey` VARCHAR(100) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`objObjectType` VARCHAR(100) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`objTypeName` VARCHAR(100) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`objLabel` VARCHAR(100) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`objValue` VARCHAR(100) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`objDateCreated` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`objCreatorID` CHAR(32) NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
【问题讨论】:
【参考方案1】:not null
约束在字符集和排序规则之后:
CREATE TABLE `my_object_attribute_map` (
`objID` INT(10) UNSIGNED auto_increment NOT NULL primary key,
`objForeignKey` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`objObjectType` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
...
);
【讨论】:
非常感谢!我不知道。 无论是在创建时还是之后,引号在区分大小写方面都没有任何区别,而且 camelCase 不会比 camel_case dbfiddle.uk/… 更需要引用 @ysth:感谢演示,这确实说明了您的观点。我错误地认为数据库在这方面是一致的,但显然情况并非如此:它发生在 Oracle 和 Postgres (dbfiddle.uk/…) 中,但不在 MySQL 中。我删除了那部分答案。【参考方案2】:列定义的语法有一些缺陷;见https://dev.mysql.com/doc/refman/8.0/en/create-table.html 和https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html。
基本上,CHARACTER SET 是数据类型的一部分,并且必须位于 NOT NULL 之前,这是适用于任何类型的额外属性。 COLLATE 我相信原则上也是数据类型的一部分,并且也应该出现在 NOT NULL 之前,但如果你在之后指定它仍然有效(或被忽略,对于非字符串类型),大概是为了向后兼容。
由于排序规则集也决定了字符集,因此您可以将字符集保留在任何位置并指定 COLLATE。
【讨论】:
以上是关于为啥这个 MySQL CREATE TABLE 语句失败?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 函数 Create Table 给了我一个语法错误
Oracle中,为啥同样的SELECT查询语句,加了CREATE TABLE AS后速度更快了?
为了工作,我的 CREATE TABLE 中缺少啥? mysql 8.X