问题1:判断是否中文, 也就是是否全半角
方式1.asciistr(name) like ‘%\%’
方式2.length(a)!=lengthb(b)
备注:
转半角函数:to_single_byte
转全角函数:TO_MULTI_BYTE
比如:
select length(‘哈.哈’),lengthb(‘哈.哈’) from dual;
问题2:判断 姓名,
注意,姓名是汉字,不是中文!
有3种方式
1.替换所有标点字母数字,剩下的就是汉字(不推荐)
2.直接使用正则(有缺陷)
--这种只对部分中文有效,多以不行的,比如小明就无法识别
select * from dual where regexp_like('小明','[' || unistr('\4e00') || '-' || unistr('\9fa5') || ']');
类似这个也是不行的, java的话是可以识别的
SELECT * from dual where '哈哈' NOT LIKE '([\\u4e00-\\u9fa5])+' ;
3.使用函数分解字符判断
--判断是否全中文
create or replace function gbs_check_hanzi(p_str varchar2)
return pls_integer deterministic
as
--0 不是 1是
v_flag pls_integer :=0;
v_temp varchar2(4);
begin
if p_str is null then
return 0;
end if;
for x in 1.. length(p_str) loop
v_temp:=substr(p_str,x,1);
-- dbms_output.put_line(substr(p_str,x,1));
if asciistr(v_temp) between '\4E00' and '\9FA5' then
v_flag:=1;
else
return 0;
end if;
end loop;
return v_flag;
end;
上面的截图中 汉字问题可以在这个函数基础上改造一下就可以了;
至于英文问题那就直接使用正则就可以判断了;
--匹配A B形式,这里空格最多一个 或者A·B ·最多一个
例子如下:
select * from dual where regexp_like('aah sakjhs','^[A-Za-z]+ ?[A-Za-z]+$')
or regexp_like('aahsa·kjhs','^[A-Za-z]+·?[A-Za-z]+$')
create table ysy_tab3
(
eno varchar2(10),
ename varchar(40)
);
insert into ysy_tab3 (ENO, ENAME)
values ('1', '小明');
insert into ysy_tab3 (ENO, ENAME)
values ('2', '赵赵丽颖');
insert into ysy_tab3 (ENO, ENAME)
values ('3', '天下霸唱');
insert into ysy_tab3 (ENO, ENAME)
values ('4', '猎杀T34');
insert into ysy_tab3 (ENO, ENAME)
values ('5', '终结者3');
insert into ysy_tab3 (ENO, ENAME)
values ('6', 'tom');
insert into ysy_tab3 (ENO, ENAME)
values ('7', 'tom hello');
select gbs_check_hanzi(aa.ename),aa.ename from ysy_tab3 aa;