Oracle 插入一些特殊字符串,居然部分乱码了(解决方案请注意这个小细节)

序言

最近我遇到了一个奇怪的问题,我在Oracle数据库中插入了字符串Insção de Créo却出现了乱码的情况。我使用各种搜索引擎,甚至询问了ChatGPT,但都没有得到正确的解决方案。

发现问题差异点

  1. 我使用PL/SQL工具进行编辑保存,或者使用SQL语句插入数据时,都会出现乱码问题。
  2. 我使用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 是不会乱码的。

那为什么这样就不会乱码?

首先得分析 varchar2nvarchar2 的区别:
在这里插入图片描述
发现编码为orcle 数据库的编码为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK

那在代码里面注意用ps.setNString(), 而不是 ps.setString() 进行值设置,会根据数据库编码转换,所以造成了乱码,得强制用ps.setNString() 才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术干货

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值