指定密钥太长;最大密钥长度为767字节。 SQL错误:1071

时间:2017-09-06 11:31:59

标签: mysql sql sql-server

CREATE TABLE IF NOT EXISTS `dbo`.`Discounts` (
  `Id` INT NOT NULL AUTO_INCREMENT,
  `Description` LONGTEXT CHARACTER SET 'utf8mb4' NULL,
  `Code` VARCHAR(255) CHARACTER SET 'utf8mb4' NULL,
  `Catalog_Id` INT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE INDEX `UQ_Discounts_CatalogCode` (`Catalog_Id` ASC, `Code`(255) ASC),
  CONSTRAINT `Discount_Catalog`
    FOREIGN KEY (`Catalog_Id`)
    REFERENCES `dbo`.`Catalogs` (`Id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

我打算将数据从SSMS迁移到mysql。最后我收到了这个错误。我该如何解决?

2 个答案:

答案 0 :(得分:0)

您正在使用utf8mb4,因此在最坏的情况下每个字符需要4个字节

utf8mb4的 utf8 191 字符的 255 字符的最大密钥长度为767个字节

多个选项:

  • 使用不同的字符集
  • 减少所需的字符数
  • 在较短的前缀上构建唯一性约束,如下所示:

    (UNIQUE INDEX'UQ_Discounts_CatalogCode'('Catalog_Id'ASC,'Code'(191)ASC))

答案 1 :(得分:0)

您可以使用Barracuda文件格式并启用innodb_large_prefix变量来避免该错误。

有关详细信息,请参阅我的博文:http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/