由于数据库一直都是延期最开始的 ZHS16GBK字符集实际使用中发现字段类型为varchar2时生僻字无法保存存进去查询出来是号。一、终极解决方案(改数据库编码级弊端很大)-不推荐将数据库字符集改为 AL32UTF8UTF-8 编码VARCHAR2 也能直接支持所有 Unicode 字符。这样就不必依赖 NVARCHAR2统一使用 VARCHAR2 即可。但这是一个重大变更需要迁移数据评估应用兼容性。因为数据库改为UTF-8 编码 每个中文占用3个字节、而ZHS16GBK 数据库每个汉字占用两字节而varchar的最大长度为4000字节改为UTF-8会导致原有字段的内容可能长度不够而被截断所以这个方式根本不适应已经上线的项目。二、后台解决方案(碰到需手动处理)-推荐2.1 字段类型 从VARCHAR2转为NVARCHAR2首先需要把字段类型 从VARCHAR2转为NVARCHAR2 已验证PLSQL可以直接修改并且对java程序等都不影响不用改代码。2.2 后台执行sql修改改成NVARCHAR2 后 比如 用户姓名 “金䶮” 其中“䶮” 为偏僻字保存后显示 “?”我们先查询到 “金䶮”的unicode编码java有方法可以中文转unicode我是直接使用在线网站工具https://www.sojson.com/金䶮 转为unicode编码为 \u91D1\u4DAE Unicode 码点用十六进制表示然后数据库后台执行sql修改姓名 \不需要updatetj_tjdabsetxm(selectutl_raw.cast_to_nvarchar2(91D14DAE)fromdual)wheredabhD10025231206092640执行后再次查询发现数据库已经保存正常了-- 好像有更简单的方式 加个N在前面就行updatetj_tjdabsetxmN金䶮wheredabhD10025231206092640oracle utl_raw函数解释UTL_RAW.CAST_TO_NVARCHAR2(raw_value)功能将一个 RAW 类型的字节序列按照国家字符集NCHAR Character Set的编码方式转换为 NVARCHAR2 字符串。输入RAW 类型通常是一个十六进制字符串如 ‘91D14DAE’。输出NVARCHAR2 字符串。关键点这个转换是 按字节解释不是按数据库字符集如 ZHS16GBK而是按 国家字符集通常是 AL16UTF16来解码。