You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:31:07