如何在Liquibase的Oracle SQL中指定字符编码及解决特殊字符乱码问题
解决Liquibase+Oracle特殊字符编码问题的完整方案
我之前在处理法语特殊字符(é、ç、à这些)的时候也踩过同样的坑,结合实际操作经验,给你分步骤解决:
1. Notepad++的正确编码设置
绝对要选UTF-8 without BOM来保存你的Liquibase SQL脚本!
- 操作步骤:打开脚本后,点击Notepad++顶部的「编码」菜单,选择「UTF-8 without BOM」,然后保存文件。
- 为什么不能选带BOM的UTF-8?因为Oracle和Liquibase解析脚本时,BOM(字节顺序标记)会被当成无效字符,导致脚本执行报错或者乱码;选ANSI更不行,ANSI是系统默认编码(比如中文系统是GBK),跨环境或者数据库字符集不匹配时必然乱码。
2. Liquibase配置层面指定编码
要确保Liquibase读取脚本和连接Oracle时都用UTF-8编码,分两个地方配置:
2.1 配置Liquibase的文件编码
在你的liquibase.properties(或者yaml/yml配置文件)里添加一行:
fileEncoding=UTF-8
这会让Liquibase以UTF-8编码读取你的SQL脚本文件,避免读取时就出现编码转换错误。
2.2 配置Oracle JDBC连接的编码
在JDBC连接URL里加上编码参数,确保和数据库字符集匹配。如果你的Oracle数据库字符集是AL32UTF8(推荐的UTF-8兼容字符集),URL应该写成这样:
url=jdbc:oracle:thin:@//your-db-host:1521/your-sid?useUnicode=true&characterEncoding=UTF-8
另外,如果你是通过环境变量配置,也可以设置NLS_LANG=AMERICAN_AMERICA.AL32UTF8,这会让JDBC连接默认使用UTF-8编码。
3. 验证数据库本身的字符集
如果前面两步都做了还是乱码,那得检查Oracle数据库的字符集:
- 登录SQL*Plus或者PL/SQL Developer,执行以下查询:
SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
如果结果不是AL32UTF8或者UTF8,那数据库本身不支持完整的UTF-8字符,需要修改数据库字符集(这个操作要谨慎,最好先备份数据)。
4. 脚本编写的注意事项
- 直接在脚本里写原始的特殊字符就行,比如
INSERT INTO users (full_name) VALUES ('Jean-Luc Décarie');,不需要转义成ASCII码或者Unicode编码,只要前面的编码配置都正确,Oracle会正确存储这些字符。 - 测试时可以先在SQLPlus里执行脚本,如果SQLPlus里能正确插入和显示特殊字符,说明脚本本身没问题,问题大概率在Liquibase的配置上。
内容的提问来源于stack exchange,提问作者CHHIBI AMOR
相关产品推荐
相关产品推荐

