## 场景1: ZHS16GBK UTF8 1.查看数据库的字符集相关设置: SQL> select * from v$nls_parameters; NLS_LANGUAGE AMERICAN 0 NLS_TERRITORY AMERICA 0 NLS_CURRENCY $ 0 NLS_ISO_CURRENCY AMERICA 0 NLS_NUMERIC_CHARACTERS ., 0 NLS_CALENDAR GREGORIAN 0 NLS_DATE_FORMAT DD+MON+RR 0 NLS_DATE_LANGUAGE AMERICAN 0 NLS_CHARACTERSET ZHS16GBK 0 NLS_SORT BINARY 0 NLS_TIME_FORMAT HH.MI.SSXFF AM 0 NLS_TIMESTAMP_FORMAT DD+MON+RR HH.MI.SSXFF AM 0 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR 0 NLS_TIMESTAMP_TZ_FORMAT DD+MON+RR HH.MI.SSXFF AM TZR 0 NLS_DUAL_CURRENCY $ 0 NLS_NCHAR_CHARACTERSET UTF8 0 NLS_COMP BINARY 0 NLS_LENGTH_SEMANTICS BYTE 0 NLS_NCHAR_CONV_EXCP FALSE 0 NLS_CHARACTERSET++》 ZHS16GBK NLS_NCHAR_CHARACTERSET++》 UTF8 可以看到数据库字符集和国家字符集分别如上。 2.建立测试表。设置2个字段:分别为varchar2和nvarchar2 SQL> create table char_test (name_char varchar2(100),name_nchar nvarchar2(100)); Table created. nvarchar2会比varchar2存的中文多一些 3.插入测试数据。 insert into char_test(name_char,name_nchar) VALUES('㱔','㱔'); insert into char_test(name_char,name_nchar) VALUES('????','????'); insert into char_test(name_char,name_nchar) VALUES('㛃','㛃'); 4.查询相关数据 SELECT * FROM char_test; SQL> SELECT * FROM char_test; 结果:乱码 ## 场景2: AL32UTF8 AL16UTF16 1.查看数据库字符集情况 SQL> set linesize 1000 SQL> set pagesize 0 SQL> select * from v$nls_parameters; NLS_LANGUAGE AMERICAN 0 NLS_TERRITORY AMERICA 0 NLS_CURRENCY $ 0 NLS_ISO_CURRENCY AMERICA 0 NLS_NUMERIC_CHARACTERS ., 0 NLS_CALENDAR GREGORIAN 0 NLS_DATE_FORMAT DD+MON+RR 0 NLS_DATE_LANGUAGE AMERICAN 0 NLS_CHARACTERSET AL32UTF8 0 NLS_SORT BINARY 0 NLS_TIME_FORMAT HH.MI.SSXFF AM 0 NLS_TIMESTAMP_FORMAT DD+MON+RR HH.MI.SSXFF AM 0 NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR 0 NLS_TIMESTAMP_TZ_FORMAT DD+MON+RR HH.MI.SSXFF AM TZR 0 NLS_DUAL_CURRENCY $ 0 NLS_NCHAR_CHARACTERSET AL16UTF16 0 NLS_COMP BINARY 0 NLS_LENGTH_SEMANTICS BYTE 0 NLS_NCHAR_CONV_EXCP FALSE 0 NLS_CHARACTERSET++》 AL32UTF8 NLS_NCHAR_CHARACTERSET++》 AL16UTF16 可以看到数据库字符集和国家字符集分别如上。 2.建立测试表。设置2个字段:分别为varchar2和nvarchar2 SQL> create table char_test (name_char varchar2(100),name_nchar nvarchar2(100)); Table created. nvarchar2会比varchar2存的中文多一些 3.插入测试数据。 insert into char_test(name_char,name_nchar) VALUES('㱔','㱔'); insert into char_test(name_char,name_nchar) VALUES('????','????'); insert into char_test(name_char,name_nchar) VALUES('㛃','㛃'); commit; 4.查询相关数据 SELECT * FROM char_test; SQL> SELECT * FROM char_test; 结果:乱码 ## 场景3: AL32UTF8 AL16UTF16 将字符转换为 Unicode 再次插入 https://www.bejson.com/convert/unicode_chinese/ 㱔 ++>\u3c54 ???? ++>\ud85f\udff9 㛃 ++>\u36c3 㱔 字的unicode编码为:\u3c54 然后,从dual中查询结果: 1、查询varchar2的结果: select utl_raw.cast_to_varchar2('3c54') from dual; select utl_raw.cast_to_varchar2('d85fdff9') from dual; select utl_raw.cast_to_varchar2('36c3') from dual; 结果:乱码 2、查询nvarchar2的结果: select utl_raw.cast_to_nvarchar2('3c54') from dual; select utl_raw.cast_to_nvarchar2('d85fdff9') from dual; select utl_raw.cast_to_nvarchar2('36c3') from dual; 结果:正常显示 测试发现,下面的nvarchar2 查询可以正常查询 insert into char_test values ((select utl_raw.cast_to_nvarchar2('3c54') from dual),(select utl_raw.cast_to_nvarchar2('3c54') from dual)); insert into char_test values ((select utl_raw.cast_to_nvarchar2('d85fdff9') from dual),(select utl_raw.cast_to_nvarchar2('d85fdff9') from dual)); insert into char_test values ((select utl_raw.cast_to_nvarchar2('36c3') from dual),(select utl_raw.cast_to_nvarchar2('36c3') from dual)); commit; select * from char_test; 结果:正常显示 ## 场景4:ZHS16GBK UTF8 将字符转换为 Unicode 再次插入 https://www.bejson.com/convert/unicode_chinese/ 㱔 ++>\u3c54 ???? ++>\ud85f\udff9 㛃 ++>\u36c3 㱔 字的unicode编码为:\u3c54 然后,从dual中查询结果: 1、查询varchar2的结果: select utl_raw.cast_to_varchar2('3c54') from dual; select utl_raw.cast_to_varchar2('d85fdff9') from dual; select utl_raw.cast_to_varchar2('36c3') from dual; 结果: 乱码 2、查询nvarchar2的结果: select utl_raw.cast_to_nvarchar2('3c54') from dual; select utl_raw.cast_to_nvarchar2('d85fdff9') from dual; select utl_raw.cast_to_nvarchar2('36c3') from dual; 结果: 乱码 测试发现,下面的nvarchar2 查询可以正常查询 insert into char_test values ((select utl_raw.cast_to_nvarchar2('3c54') from dual),(select utl_raw.cast_to_nvarchar2('3c54') from dual)); insert into char_test values ((select utl_raw.cast_to_nvarchar2('d85fdff9') from dual),(select utl_raw.cast_to_nvarchar2('d85fdff9') from dual)); insert into char_test values ((select utl_raw.cast_to_nvarchar2('36c3') from dual),(select utl_raw.cast_to_nvarchar2('36c3') from dual)); commit; select * from char_test; 结果: 乱码 场景5:ZHS16GBK UTF8 字符集ZHS16GBK 国家字符集UTF8 怎么办? update char_test set name_nchar = N'㛃' where name_nchar='z' insert into char_test( name_nchar) VALUES(N'㱔'); SELECT * FROM zc.char_test; 㛃 ???? 㱔 查询正常 这个时候表里面的数据是正常的。 场景6: AL32UTF8 AL16UTF16 update char_test set name_nchar = N'㛃' where name_nchar='z' insert into char_test( name_nchar) VALUES(N'㱔'); SELECT * FROM zc.char_test; 㛃 ???? 㱔 查询正常 总结: 1 字段要使用 nvarchar2类型 2 AL32UTF8 AL16UTF16 要使用 cast_to_nvarchar2 进行插入或者 使用nvarchar2类型通过N 插入 3 ZHS16GBK UTF8 使用nvarchar2类型通过N'XXX'插入
oracle 生僻字怎么处理
来源:这里教程网
时间:2026-03-03 21:13:36
作者:
编辑推荐:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 【年终总结】-38岁DBA老兵,自知自心其路自明
【年终总结】-38岁DBA老兵,自知自心其路自明
26-03-03 - Windows断电后导致数据库启动异常案例分析
Windows断电后导致数据库启动异常案例分析
26-03-03 - rac中一起ora-27300 301 302问题处理
rac中一起ora-27300 301 302问题处理
26-03-03 - 记一次DG备库TEMP表空间无法添加临时文件案例分析
记一次DG备库TEMP表空间无法添加临时文件案例分析
26-03-03 - 数据库管理-第279期 相同SQL在不同实例结果竟然不同(20250107)
- javavm invalid处理
javavm invalid处理
26-03-03 - 客户吐槽数仓太大,直接30T瘦身到10T,这下舒服了...
客户吐槽数仓太大,直接30T瘦身到10T,这下舒服了...
26-03-03 - oracle触发器审计某个表的关键列更新或行删除
oracle触发器审计某个表的关键列更新或行删除
26-03-03 - Oracle DG备库数据文件损坏修复方法(ORA-01578/ORA-01110)
- 没想到Oracle 8i 到19c 还有这个缺陷
没想到Oracle 8i 到19c 还有这个缺陷
26-03-03
