为什么这个 MySQL CREATE TABLE 语句失败了?

Why is this MySQL CREATE TABLE statement failing?

这个创建语句失败了,我看不出原因。 MySQL 报告:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, objObjectType VARCHAR(100) ' at line 3*

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        
);

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, 
    ...
);

列定义的语法有一些缺点;参见 https://dev.mysql.com/doc/refman/8.0/en/create-table.html and https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html

CHARACTER SET基本上是数据类型的一部分,必须在NOT NULL之前,NOT NULL是适用于任何类型的额外属性。 COLLATE 我相信原则上也是数据类型的一部分,并且也应该出现在 NOT NULL 之前,但是如果你在之后指定它它仍然有效(或者被忽略,对于 non-string 类型),大概是为了向后兼容。

由于归类集也决定了字符集,您可以只保留字符集并在任何需要的地方指定 COLLATE。