Oracle实际应用中经常碰到字符有效性判断。
校验单个字符是否为字母、数字、符号都比较容易,Oracle提供的函数REGEXP_LIKE使用正则表达式就可以完成。但是汉字就比较特殊,需要特别处理。
1、判断字符是否为数字,V_CHAR为待校验字符(单个)
REGEXP_LIKE(V_CHAR, '(^[0-9]{1}$)')
2、判断字符是否为字母,V_CHAR为待校验字符(单个)
REGEXP_LIKE(V_CHAR, '(^[a-z]{1}$)')
REGEXP_LIKE(V_CHAR, '(^[A-Z]{1}$)')
REGEXP_LIKE(V_CHAR, '(^[a-zA-Z]{1}$)')
3、判断字符是否为特殊符号,V_CHAR为待校验字符(单个)
REGEXP_LIKE(V_CHAR, '(^[()-]{1}$)'),此正则表达式只能为()-,实际应用自行匹配
4、判断字符是否为特殊符号,V_CHAR为待校验字符(单个)
汉字比较特殊,就不能直接比较。
在网上看到有些网友通过比较LENGTH和LENGTHB长度不同来判断(length求得是字符长度,lengthb求得是字节长度),但是没有注意到全角字母A的LENGTH和LENGTHB长度不同但是明显不是字符
查询到汉字的unicode编码范围为4E00到9AF5,可以将字符转换为编码进行判断。
V_CODE := ASCIISTR(V_CHAR); --转换成ASCII字符串
V_CODE := REGEXP_REPLACE(V_CODE, '[^0-9a-zA-Z]'); --去除/,验证是否汉字
IF V_CODE >= '4E00' AND V_CODE <= '9FA5' THEN
OUT_MSG := '为汉字';
END IF;
例子:判断一个字符串中是否只包含汉字,数字,字母,-,(,)
FUNCTION FUNC_CHINESE(P_STR IN VARCHAR2 -- 输入的字符串
) RETURN VARCHAR2 IS
V_NAME VARCHAR2(256);
V_CODE VARCHAR2(256);
V_FLAG VARCHAR2(32);
V_CHAR VARCHAR2(256);
OUT_MSG VARCHAR2(256);
BEGIN
V_FLAG := 'true';
V_NAME := P_STR;
--DBMS_OUTPUT.PUT_LINE(V_NAME);
FOR I IN 1 .. LENGTH(V_NAME) LOOP
V_CHAR := SUBSTR(V_NAME, I, 1); --取字符
--首先判断是否数字,字母,下划线,括号
IF REGEXP_LIKE(V_CHAR, '(^[0-9a-zA-Z()-]{1}$)') THEN
OUT_MSG := '为数字字母()-';
--如果不是数字,字母,下划线,括号
ELSE
V_CODE := ASCIISTR(V_CHAR); --转换成ASCII字符串
V_CODE := REGEXP_REPLACE(V_CODE, '[^0-9a-zA-Z]'); --去除/,验证是否汉字
--DBMS_OUTPUT.PUT_LINE(V_CODE);
IF V_CODE >= '4E00' AND V_CODE <= '9FA5' THEN
OUT_MSG := '为汉字';
ELSE
OUT_MSG := '不为汉字';
V_FLAG := 'false';
END IF;
END IF;
--DBMS_OUTPUT.PUT_LINE(V_CHAR || ' :' || OUT_MSG);
END LOOP;
RETURN V_FLAG;
END;