Oracle UTF-16与PostgreSQL UTF-8字符串对比问题求助
解决Oracle(UTF-16)与PostgreSQL(UTF-8)字符串对比的特殊字符差异问题
核心问题出在编码体系的字节值与Unicode码点混淆:
- Oracle里的
chr(146)实际是Windows-1252编码的字节值,对应Unicode的U+2019(右单引号,也就是你看到的撇号) - PostgreSQL的
chr()函数默认接收的是Unicode码点,chr(146)对应U+0092(一个不可见的控制字符),只是部分工具会把它渲染成撇号,导致视觉一致但编码本质不同
给你几个直接可用的解决方法:
方法1:统一编码转换
从Oracle端处理
确保Node.js的Oracle驱动把数据从Windows-1252(Oracle实际存储的编码,虽标注UTF-16但此处chr(146)是Windows-1252字节)转换为UTF-8。示例驱动配置:
const oracledb = require('oracledb'); oracledb.initOracleClient({ configDir: '/path/to/oracle' }); const connection = await oracledb.getConnection({ user: 'your_user', password: 'your_pwd', connectString: 'your_conn_str', encoding: 'UTF8' // 驱动自动将Oracle字符集转成UTF-8 });
从PostgreSQL端处理
如果需要在PG里匹配Oracle的chr(146),用convert_from把字节按Windows-1252解码:
-- PostgreSQL生成与Oracle chr(146)一致的撇号 select convert_from(chr(146)::bytea, 'WIN1252');
方法2:用Unicode码点统一生成字符
两边直接使用目标字符的Unicode码点生成,彻底避免编码混淆:
- Oracle用Unicode转义序列:
select chr(unistr('\2019')) from dual;(\2019是U+2019的十六进制) - PostgreSQL用十进制码点:
select chr(8217);(U+2019的十进制是8217)
方法3:Node.js端标准化字符串对比
拿到两边字符串后,用Unicode标准化工具统一成相同形式再对比:
function normalizeString(str) { return str.normalize('NFC'); // NFC是最常用的Unicode标准化形式 } // 对比前先标准化 const oracleStr = normalizeString(oracleResult); const pgStr = normalizeString(pgResult); console.log(oracleStr === pgStr); // 此时可正确对比
内容的提问来源于stack exchange,提问作者setianea
相关产品推荐
相关产品推荐

