为啥这个 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,objObjectTypeVARCHAR(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

MySQL 函数 Create Table 给了我一个语法错误

Oracle中,为啥同样的SELECT查询语句,加了CREATE TABLE AS后速度更快了?

为了工作,我的 CREATE TABLE 中缺少啥? mysql 8.X

我想做一个bat文件,里面是一些创建mysql表的语句(create table ***();。。。),

MySQL create table as与create table like对比