Oracle SQL查询含重音字符无返回 如何在PL/SQL中获取正确结果
Oracle PL/SQL中带特殊重音字符查询无返回的解决方法
你当前使用的查询语句如下:
select t_req from table where t_req='TÉLITINO MORINOS'
已确认表中存在t_req字段值为TÉLITINO MORINOS的数据行,但查询返回0条记录,可按以下顺序排查解决:
- 检查客户端与数据库端字符集一致性
首先在PL/SQL中执行语句查询数据库端字符集配置:
确认本地PL/SQL客户端配置的NLS_LANG参数、客户端字符集和上述查询返回的数据库字符集完全一致。带重音的select userenv('language') from dual;É属于特殊字符,两端字符集不匹配时会出现传输转码错误,导致输入值和库中存储值实际编码不一致,等值匹配失败。 - 排查重音编码/排序规则差异问题
部分场景下输入的É和库中存储的É视觉上无差异,但实际是不同编码(比如单字符重音和组合重音的区别),且字段默认排序规则为重音敏感时就会匹配失败。可以先用不区分重音、不区分大小写的排序规则做匹配验证:
如果上述语句能返回目标行,就说明是重音编码不一致导致的问题,后续可以统一字段存储的字符编码,或者在业务查询中按需使用对应的nlssort规则做匹配。select t_req from table where nlssort(t_req, 'nls_sort = BINARY_AI') = nlssort('TÉLITINO MORINOS', 'nls_sort = BINARY_AI'); - 排查存储值带不可见字符问题
如果前两种方式都没有解决,需要确认库中存储的目标值是否带有前后空格、不可见控制字符。先通过模糊匹配定位到目标行,查看实际存储的编码:
对比存储值的编码和你输入的常量字符串编码,如果存在多余的不可见字符,可以在查询时先做清洗再匹配,比如先去除前后空白:select t_req, dump(t_req, 1016) as stored_code from table where t_req like '%LITINO MORINOS%';select t_req from table where trim(t_req) = 'TÉLITINO MORINOS';
内容的提问来源于stack exchange,提问作者Katty
相关产品推荐
相关产品推荐

