【问题标题】:JPA Unique Index creation in MySQL silently failsMySQL 中的 JPA 唯一索引创建静默失败
【发布时间】:2016-12-16 15:09:37
【问题描述】:

我的 POJO 有一个属性name,它应该是唯一的,因此我用@Column(unique = true) 对其进行了注释。长度默认为 255,我使用 MySQL 5.5,数据库排序规则设置为 utf8mb4_bin。我知道我无法在列上指定唯一约束,但是我想知道为什么我的日志文件中没有关于索引创建失败的警告/错误。 MySQL 使用“#1071 - Specified key was too long; max key length is 767 bytes”响应手动尝试创建索引,因此至少应该看到某种提示,不是吗?

有没有办法在运行时处理/捕获这些类型的错误?例如。记录错误消息,以便开发人员知道出了什么问题。

我将 spring-boot-starter-parent 用作我的项目的 maven-parent 1.4.2.RELEASE 并包含 spring-boot-starter-data-jpa 以添加所有相关的依赖项。这包括 spring-data-jpa-1.10.5.RELEASE 和 hibernate-core-5.0.11。

【问题讨论】:

    标签: java mysql spring hibernate jpa


    【解决方案1】:

    错误是由于

    InnoDB 的最大索引长度为 767 字节,因此对于 utf8 或 utf8mb4 列,您可以分别索引最多 255 或 191 个字符。如果您当前有索引长度超过 191 个字符的 utf8 列,则需要索引较少数量的字符。 https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html

    您使用的字段为 255,而 utf8mb4_bin 的最大值为 191,因此您会遇到未创建索引的错误,如果这是警告,它将创建最大值为 191 的索引。

    【讨论】:

    • 亲爱的罗密欧,感谢您的反馈。然而,我的问题集中在 Java 方面。我指出我知道潜在的 MySQL 问题,我想知道如何处理模式创建期间的错误,这些错误在我的代码和日志文件中都不会引发任何危险信号。
    • 抱歉不匹配。我用spring.jpa.hibernate.ddl-auto=create-drop 测试了相同的版本,并在日志org.hibernate.tool.hbm2ddl.SchemaExport : Specified key was too long; max key length is 767 bytes 中有错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多