TRANSLATE USING表达式

Oracle迁移应用到PolarDB时,代码中包含的Oracle特有 TRANSLATE ... USING语法可能导致执行失败。为简化迁移,PolarDB兼容此语法,使存量代码无需修改即可运行。

适用范围

您的PolarDB PostgreSQL版(兼容Oracle)集群的修订版本需为2.0.14.18.37.0及以上

说明

您可在控制台查看内核小版本号,也可以通过SHOW polardb_version;语句查看。如未满足内核小版本要求,请升级内核小版本

工作原理

TRANSLATE ... USING表达式仅用于兼容Oracle语法,而非实现对等功能。

对比维度

Oracle中的行为

PolarDB中的行为(关键差异)

主要作用

在数据库字符集 CHAR_CS和国家字符集NCHAR_CS之间进行真实的字符编码转换。

仅用于语法兼容,确保包含此语法的代码能够通过解析并成功执行。

转换行为

发生真实的字节级转换。

不发生任何字符集转换。表达式的行为等同于类型转换CAST(expr AS VARCHAR),原样返回输入内容。

USING CHAR_CS

将表达式转为数据库字符集,返回VARCHAR2

返回VARCHAR类型,内容与输入字符串完全相同。

USING NCHAR_CS

将表达式转为国家字符集,返回NVARCHAR2

返回VARCHAR类型,内容与输入字符串完全相同。USING CHAR_CS的效果没有区别

使用示例

验证语法兼容性

验证TRANSLATE USING表达式在处理包含多字节字符(如中文)的字符串时,不会改变字符串内容。

执行以下SQL语句:

SELECT 
    TRANSLATE('你好,PolarDB' USING CHAR_CS) AS result_char_cs,
    TRANSLATE('你好,PolarDB' USING NCHAR_CS) AS result_nchar_cs;

预期结果

返回两列完全相同的结果,证明CHAR_CSNCHAR_CS子句在PolarDB中没有功能差异。

 result_char_cs | result_nchar_cs 
----------------+-----------------
 你好,PolarDB   | 你好,PolarDB

执行实际的字符集转换

如需实现真实的字符集编码转换(例如,从UTF8转换为LATIN1),不应使用TRANSLATE USING表达式。应使用标准的CONVERT()函数执行字符集转换。