You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:02