【问题标题】: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        
);

【问题讨论】:

    标签: mysql sql string mysql-workbench create-table


    【解决方案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.htmlhttps://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html

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

    由于排序规则集也决定了字符集,因此您可以将字符集保留在任何位置并指定 COLLATE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多