序言
最近我遇到了一个奇怪的问题,我在Oracle数据库中插入了字符串Insção de Créo
却出现了乱码的情况。我使用各种搜索引擎,甚至询问了ChatGPT,但都没有得到正确的解决方案。
发现问题差异点
- 我使用PL/SQL工具进行编辑保存,或者使用SQL语句插入数据时,都会出现乱码问题。
- 我使用navicat工具直接编辑保存,是可以的。但是直接用SQL语句插入还是乱码。
在这里,我似乎看到了一丝希望,但是仍然不清楚为什么Navicat和其他方式会有差异。即使查看Navicat执行历史记录,也没有发现明显的差异。
这个问题对于我来说非常紧急,因为项目已经上线,我需要尽快找到解决方法,否则我的头发就要被揪光了。
问题复现
create table test(name varchar2(200));
insert into test (name) values ('Insção de Créo');
这个时候 观察现象是Insção de Créo
变成了 Ins??o de Créo
解决方案
create table test(name nvarchar2(200));
insert into test (name) values (N'Insção de Créo');
这个时候 观察现象是Insção de Créo
是不会乱码的。
那为什么这样就不会乱码?
首先得分析 varchar2
和 nvarchar2
的区别:
发现编码为orcle
数据库的编码为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
那在代码里面注意用ps.setNString()
, 而不是 ps.setString()
进行值设置,会根据数据库编码转换,所以造成了乱码,得强制用ps.setNString()
才行。