WITH X AS
(SELECT '2320*fd少df,' SR
FROM DUAL
UNION ALL
SELECT '¥@().' SR
FROM DUAL
UNION ALL
SELECT 'heleo;""' SR
FROM DUAL
UNION ALL
SELECT '年' SR
FROM DUAL
UNION ALL
SELECT 'ds★强f' SR
FROM DUAL
UNION ALL
SELECT '350k, 。' SR
FROM DUAL
UNION ALL
SELECT 'a #@%&*则 df
' SR
FROM DUAL
UNION ALL
SELECT 'DSA~!国强' SR
FROM DUAL
UNION ALL
SELECT '龘楇覢' SR
FROM DUAL)
SELECT SR
FROM (SELECT REGEXP_REPLACE(REGEXP_REPLACE(SR, '\W'), '[a-zA-Z0-9_]') SR
FROM X)
WHERE SR IS NOT NULL;
之前有遇到查询表里某列是否含有汉字的需求。
百度上有很多方法。大体上都是利用ASCIISTR(COL) LIKE'%\%',ASCIISTR(将任意字符集的字符串转换为当前数据库实例对应的ascii字符串)。利用汉字是双字节,且简体汉字的编码范围是B0A1 - F7FE ,通过ASCIISTR(COL) 转换UTF-16格式 过来后,每个汉字前面带有一个 反斜杠 来判断的。这样一点都不科学。简体汉字转换过来带有反斜杠,不代表转换过来的带有反斜杠的一定是简体汉字。比如五角星、全角字符之类的。还有这里一直说的是简体汉字。遇到繁体字就GG思密达了。
还有一些人写了很复杂的FUNCTION来判断。这个我也试过了,遇到全角和某些繁体字也是行不通。
还有的使用length()与lengthb()来判断,也是利用汉字是双字节。这个更是错的。全、半角的长度都能推翻。
SELECT LENGTH('-') LG, --半角横杠
LENGTHB('-') LG2, --全角横杠
ASCIISTR('国') SR, --转换中文简体
ASCIISTR('f') SR2 --转换全角字符
FROM DUAL;
一直提倡,写出来的SQL,一定是通用的。这里我是利用正则写了一个很简单的滤除。大家可以参考下,利用的是 \W:匹配字母或数字或下划线或汉字。目前我测试还是没出现问题的。大家使用时遇到问题可以告诉我。