为什么这个 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。
这个创建语句失败了,我看不出原因。 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。