在oracle中,如何查找列是否包含任何非英语字母?

在oracle中,如何查找列是否包含任何非英语字母?,oracle,unicode,Oracle,Unicode,我有一个要求,打印问号,如果一个领域包含任何外国(非英语)字母。例如,我需要实现以下输出 我考虑使用oracle函数,检查是否存在任何外来字符&随后,使用问号替换 不幸的是,我意识到甲骨文。我的意图是使用类似于“\p{L}^[a-Za-z]”的REXEXP,但不支持REGEXP_INSTR。我还有别的办法可以做到这一点吗 以下是一些示例数据: select name from (select '#Tag Company' name from dual union select 'Company

我有一个要求,打印问号,如果一个领域包含任何外国(非英语)字母。例如,我需要实现以下输出

我考虑使用oracle函数,检查是否存在任何外来字符&随后,使用问号替换

不幸的是,我意识到甲骨文。我的意图是使用类似于“\p{L}^[a-Za-z]”的REXEXP,但不支持REGEXP_INSTR。我还有别的办法可以做到这一点吗

以下是一些示例数据:

select name from
(select '#Tag Company' name from dual union
select 'Company' name from dual union
select '中文' name from dual);

在Kaushik Nayak的评论的帮助下,我成功地解决了这个问题,如下所示

  • 使用函数转换字符集
  • 比较原始字符串和转换后的字符串
  • 这是问题所在

    select 
        name, 
        CONVERT(name, 'US7ASCII', 'UTF8') proc, 
        decode(name, CONVERT(name, 'US7ASCII', 'UTF8'), name, '?') name_proc from
    (select '#Tag Company' name from dual union
    select 'Company' name from dual union
    select '中文' name from dual);
    
    输出:


    REGEXP\u xxx
    函数支持unicode字符,例如:

    select regexp_replace('中文', '中', '文') from dual;
    
    REGEXP_REPLACE('中文','中','文')
    ----------------------------
    文文                          
    1 row selected.
    
    您可能在使用某些欧洲字符进行
    转换时遇到问题,例如:

    SELECT CONVERT('ä é ô', 'US7ASCII') FROM dual;
    
    CONVERT('ÄÉÔ','US7ASCII')
    ----------------------------
    a e o                    
    1 row selected.
    
    你看,非英语字符(不管是什么意思)不会被
    替换

    如果您要求替换非ASCII字符,我建议您:

    SELECT REGEXP_REPLACE('中文 aä eé oô', '[^ -~]', '?') FROM dual;
    
    REGEXP_REPLACE('中文AÄEÉOÔ','[^-~]','?')
    --------------------------------------
    ?? a? e? o?                           
    1 row selected.
    
    或者,如果必须用单个问号替换整个字符串,请使用:

    SELECT REGEXP_REPLACE('中文 aä eé oô', '.*[^ -~]+.*', '?') FROM dual;
    
    REGEXP_REPLACE('中文AÄEÉOÔ','.*[^-~]+.*','?')
    -----------------------------------------------
    ?                                         
    1 row selected.
    
    也许有一个更简单的解决方案。设置环境变量

    set NLS_LANG=.US7ASCII
    

    然后,您的客户端将自动用

    替换任何非ASCII字符。请先尝试使用convert函数,然后使用regexp。非常感谢Kaushik,当运行convert(name,'US7ASCII','UTF8')时,我看到外来字符的问号。现在,这只是一个比较的问题。你可能想看看“请不要在你的问题中放入图像”,复制/粘贴文本。谢谢你尝试。然而,我在这里只是一个学习者,不是专家。最好参考专家的解决方案。我只是从我记得的某件事上发表了评论。再次感谢。非常感谢你详细的回答。此解决方案在许多情况下都非常清晰和准确。然而,基于转换的解决方案也适用于我的需求,即用替换整个字符串?如果它是非ASCII的,因为它稍后会比较原始和转换的字符串。测试时,我意识到REGEXP.*[^-~].*也会过滤ASCII。意思是从dual中选择REGEXP_REPLACE('a1','.[^-~].','?');将返回不正确的“?”。