首页 » ORACLE 9i-23c, PostgreSQL/GaussDB » Oracle to openGauss: SQL语法兼容性中的中文(全角)符号

Oracle to openGauss: SQL语法兼容性中的中文(全角)符号

最近有项目从oracle迁移到openGuass后存在部分应用SQL提示语法不兼容问题, 后发现SQL中在原oracle执行中包含中文逗号”,”做为查询列的分隔符, 以我对oracle的认识oracle不太可能支持中文SQL语法, 找应用常用的plsql developer工具演示了一下,果然支持中文逗号,甚至还支持中文的括号,或一半中文一半英文如”()”. 但是这种SQL在mysql, postgresql, openguass是都不支持的, 有必要研究一下。

通常想可能的原因:
1, plsql developer这类客户端自动给SQL转换了SQL text文本
2, jdbc驱动在执行时转换sql text文本
3, oracle内核支持了该SQL中包含此类符号

我们先还原一下这个问题



Note:
可见在plsql dev中确实可以使用中文逗号,并行在v$sql.sql_text也是中文逗号,并不是plsql dev做了sql text的replace; 使用sqlplus 也可以还原出该问题,甚至使用了混合的括号,(注意SQLPLUS模拟需要修改客户端的字符集如xshell或crt, 同时修改NLS_LANG). 这测试基本排除了上面可能的1或2原因。

发现很久很久前oracleblog.org 记录过该问题, 严格来说不是支持中文的问题,而是一些符号的全角与半角的问题,

Bug 13328675 : ORA-911 IS NOT REPORTED WHEN USING FULL-WIDTH CHARACTERS ON 11G.
在BUG的内部介绍中提到,原来在10g中使用的qcplgnt_multibyte函数,在11g中已经改用成qcplgte_multibyte,可以将multibyte 转换成singlebyte,所以……也就是能将全角的逗号转换成半角的逗号来识别了

除了逗号(- Comma(,)),类似的符号还有:
– Space( )
– equal(=)
– Unequal(<>)
– Atmark(@)
– Period(.)
– Pipe(||)
– Parentheses (())

在Oracle中虽然支持,但还是建议仅可能统一使用半角字符,而这个兼容性目前在其它数据库还不支持,也无法简单的在驱动层做sql text的replace。

打赏

,

对不起,这篇文章暂时关闭评论。