Oracle连接URL未显式指定字符集会导致中文乱码,因驱动不自动读取NLS_CHARACTERSET,必须根据服务端实际编码(如AL32UTF8或ZHS16GBK)在URL中配置characterEncoding或NLS_LANG,并与useUnicode=true配合;Druid需同步设置serverEncoding和clientEncoding;SQL脚本编码也须单独配置sql-script-encoding以匹配文件真实编码。
Oracle连接URL没带字符集参数,查出来就是乱码
spring boot默认用ojdbc驱动连oracle时,不显式指定客户端字符集,驱动会按服务端默认编码(比如al32utf8或zhs16gbk)协商,但java端可能误判成iso-8859-1。结果select name from user返回"å¼ ä¸‰"这种字节错位串。
必须在JDBC URL里强制声明客户端编码:
-
jdbc:oracle:thin:@//host:port/service?useUnicode=true&characterEncoding=UTF-8(适用于较新ojdbc8+) - Oracle 11g/12c常用写法:
jdbc:oracle:thin:@//host:port/service?NLS_LANG=AMERICAN_AMERICA.AL32UTF8 - 若数据库实际是GBK(如ZHS16GBK),则改用
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
注意:&要写成&(XML/HTML转义),否则YAML解析失败;NLS_LANG值必须和SELECT userenv('language') FROM dual查出的服务端语言+字符集完全一致。
Druid连接池的connection-properties设错,插入就报错
用Druid时,光配URL不够,serverEncoding和clientEncoding必须成对出现且方向明确——前者是Oracle服务端编码,后者是Java客户端期望的编码。
常见错误配置:
- 只写
clientEncoding=GBK,漏掉serverEncoding→ 插入中文时报ORA-01401: inserted value too large for column -
serverEncoding填成UTF-8,但Oracle实际是ZHS16GBK→ 插入后查出来仍是乱码 - 没加
filters=encoding到URL前缀 → 配置完全不生效
正确写法(YAML):
spring:
datasource:
url: jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@//172.16.100.102:1521/orcl
type: com.alibaba.druid.pool.DruidDataSource
druid:
connection-properties: serverEncoding=ZHS16GBK;clientEncoding=GBK
MyBatis-Plus查出String字段自动转码失败
即使连接层编码正确,MyBatis-Plus默认用StringTypeHandler读取CLOB/VARCHAR2,若数据库字段实际存的是GBK字节流,而JVM默认用UTF-8解码,就会得到"涓?涓?涓?"。
两种应对方式:
- 全局统一:在
application.yml加mybatis-plus.configuration.default-scripting-language-driver=org.apache.ibatis.scripting.xmltags.XMLLanguageDriver(无效,此为干扰项,忽略)→ 实际应靠连接层解决 - 精准修复:确认Oracle服务端字符集后,在Druid或Hikari中严格匹配
clientEncoding,**不要依赖MyBatis-Plus自动转码** - 临时兜底:在Mapper XML里用
#{name,jdbcType=VARCHAR,javaType=string},避免类型推断偏差
重点:MyBatis-Plus本身不处理字符集转换,它只是把JDBC返回的byte[]交给String构造器——所以根源永远在JDBC连接配置。
Spring Boot启动时SQL脚本执行乱码
如果用spring.datasource.schema或spring.sql.init.schema-locations初始化建表/插数据,脚本里含中文注释或默认值,但脚本文件本身是GBK保存,而Spring Boot默认按UTF-8读取,就会报ORA-00911: invalid character或字段值变成问号。
必须显式指定脚本编码:
- properties写法:
spring.datasource.sql-script-encoding=GBK - YAML写法:
spring: datasource: sql-script-encoding: GBK - 确保你的
.sql文件真实编码与配置值一致(用IDEA右下角查看并转换)
这个配置只影响schema.sql/data.sql加载,不影响运行时SQL查询——别把它和JDBC连接编码混为一谈。
最易被忽略的点:Oracle服务端字符集(userenv('language'))、JDBC URL里的NLS_LANG、Druid的clientEncoding、SQL脚本文件编码,这四者必须两两对齐。少对一环,中文就断在某个环节上,而且错误现象相似,很难定位。











