JPABuddy生成MySQL Liquibase初始化脚本:nvarchar默认utf8mb3的问题
用JPABuddy给MySQL 8.0.33生成Liquibase初始化脚本时,生成的nvarchar类型默认绑定了已被弃用的utf8mb3字符集和utf8mb3_general_ci排序规则,执行脚本时会弹出MySQL警告:
0 row(s) affected, 1 warning(s): 3720 NATIONAL/NCHAR/NVARCHAR implies the character set UTF8MB3, which will be replaced by UTF8MB4 in a future release. Please consider using CHAR(x) CHARACTER SET UTF8MB4 in order to be unambiguous.
直接把脚本里的nvarchar改成varchar虽然能消警告,但会破坏Liquibase变更日志的灵活性,分享几个更合理的解决办法:
改JPABuddy默认配置,直接生成utf8mb4的脚本
打开JPABuddy的设置,找到数据库相关配置项,在MySQL的默认字符集里选utf8mb4,排序规则选utf8mb4_unicode_ci(或者官方推荐的其他规则)。这样后续生成的Liquibase脚本里,nvarchar类型会自动关联正确的字符集,不会再出警告。用Liquibase的modifySql适配MySQL,不改动原始脚本结构
如果不想改JPABuddy的配置,在Liquibase的变更集里给nvarchar字段加字符集指定,用modifySql只针对MySQL生效:<column name="your_column" type="nvarchar(255)"> <constraints nullable="false"/> <modifySql dbms="mysql"> <replace replace="nvarchar(255)" with="nvarchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"/> </modifySql> </column>这种方式保留了变更日志的跨数据库兼容性,不会破坏灵活性。
全局配置Liquibase的MySQL字符集
在Liquibase的配置文件(比如liquibase.properties或者Spring Boot的application.yml)里加全局参数,让所有nvarchar默认用utf8mb4:spring: liquibase: parameters: charset: utf8mb4 collation: utf8mb4_unicode_ci或者properties格式:
liquibase.database.mysql.defaultCharset=utf8mb4 liquibase.database.mysql.defaultCollation=utf8mb4_unicode_ci
内容的提问来源于stack exchange,提问作者vunhatchuong

