使用 spring boot jpa 的坑(unique 不起作用)
在使用JPA 时,定义@Entity对象时,有些字段需要唯一(如账号名),但是我发现,自动生成的数据库中,对该字段并没有设置为唯一约束
对象如下
1 | @Entity |
查看 console 输出,确实有修改命名
1 | Hibernate: |
反复测试后,发现,Long对象的 unique 可以添加成功,String 对象的不行,然后我把 String 对象加上length限制
1 | @Column(unique = true, nullable = false, length = 20) |
结果就成功了。
原因
然后查找原因,手动创建表,添加索引,出现如下错误
Specified key was too long; max key length is 767 bytes
原来是因为指定字段长度过长。未指定长度的字符串,默认为255 varchar,utf8mb4字符集每个 varchar 为4bytes,即为总长255x4=1020bytes,大于了767bytes。
因此,unique 字段的最大长度为767/4 = 191 varchar。(注:utf8mb4字符集)