Perl C-API是否有UTF-8感知的sv_insert变体?DBD-Oracle偏移问题
DBD-Oracle错误偏移标记插入的UTF-8兼容问题
当SQL语句执行出错时,DBD-Oracle会通过sv_insert在错误偏移位置插入<*>标记。但设置NLS_LANG=.AL32UTF8时,Oracle返回的错误偏移是以Unicode字符为单位的,而sv_insert以字节模式工作,导致偏移位置不匹配。
我想确认是否存在sv_insert_utf8这类UTF-8专用的变体函数,或者sv_substr_utf8这类函数也可用于解决问题。
问题演示(YaSql-Fx环境中)
> select 'arvizturo tukorfurogep' from duale; select 'arvizturo tukorfurogep' from duale * ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 37 in 'select 'arvizturo tukorfurogep' from <*>duale') > select 'árvíztűrő tükörfúrógép' from duale; select 'árvíztűrő tükörfúrógép' from duale * ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 37 in 'select 'árvíztűrő tükörfúróg\xFFFD<*>\xFFFDp' from duale')
第二个示例中,<*>标记被插入到UTF-8字节序列中间,导致出现\xFFFD<*>\xFFFD的乱码。
尝试的解决方案
半成品方案
if (nls_charset==al32utf8) { /* <FIXME> */ parse_error_offset= sv_pos_u2b_flags(sqlsv, parse_error_offset, NULL, SV_GMAGIC|SV_CONST_RETURN); }
初步验证可行的版本
{ D_imp_dbh_from_sth; int utf8_is_implied = CSFORM_IMPLIES_UTF8(imp_dbh, SQLCS_IMPLICIT); if (utf8_is_implied) { parse_error_offset= sv_pos_u2b_flags(sqlsv, parse_error_offset, NULL, SV_GMAGIC|SV_CONST_RETURN); } }
后续发现的深层问题
实际服务器返回的是基于NLS_CHARACTERSET解析的字节偏移,但DBD-Oracle无法识别该字符集。即便能获取到该字符集,NLS_LANG与NLS_CHARACTERSET之间的转换也可能非常复杂(比如UTFE(872)这类特殊字符集)。
内容的提问来源于stack exchange,提问作者Lorinczy Zsigmond
相关产品推荐
相关产品推荐

