发布网友 发布时间:2022-04-07 21:06
共2个回答
懂视网 时间:2022-04-08 01:27
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:
①全角字符的判断,或者是含有汉字的字符串的判断
本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。
11.2.0.3 RHEL6.5
看到网友问,怎么查询表中某个字段数据是不是包含了全角字符啊? 这个问题涉及到几个个函数:to_single_byte、length和lengthb,我之前做开发的时候研究的是如何判断一个字符串中是否包含中文,其实和这个本质是一样的,且看实验部分。
---含有汉字,严格的说是含有全角字符
SELECT l.name,
length(l.name),
lengthb(l.name)
FROM xb_link l
WHERE length(l.name) != lengthb(l.name)
AND length(l.name) < 20;
以下数据也满足条件:
SELECT l.id,
l.name
FROM xb_link l
WHERE length(l.name) != lengthb(l.name)
AND l.metacategory IN
(‘com.gxlu.ngrm.network.DDNCircuit‘,
‘com.gxlu.ngrm.network.FRCircuit‘,
‘com.gxlu.ngrm.network.ATMCircuit‘,
‘com.gxlu.ngrm.network.DDNOCircuit‘,
‘com.gxlu.ngrm.network.FROCircuit‘)
AND l.id IN (‘301898331‘, ‘301898335‘, ‘301908187‘, ‘301929403‘);
所以可以借助to_single_byte函数来解决。
SELECT l.id,
l.name,
to_single_byte(l.name),
length(l.name) l1,
lengthb(l.name) l2,
length
一、问题说明
在处理数据的时候,需要判断某个字段字符串中是否有中文,若有则取出中文。
二、解决办法
首先如何判断某个字段字符串中是否有中文。这里介绍三种方法:
1、采用ASCIISTR函数
说明:ASCIISTR函数用于返回字符的ASCII形式的字符串;非ASCII的字符被转化为\xxxx的形式。换句话说:如果字符中包含中文,则必定会有\xxxx的字符。
所以,我们直接利用ASCIISTR函数匹配'\'即可判断。
2、采用length和lengthb的原理
说明:中文下length返回的是字符个数,中文占1字符,lengthb返回的是字节个数,中文占2字节,根据中文的特性即可解决。
3、使用CONVERT函数判别
说明:CONVERT(要转换的字符串,目标字符集,原字符集),CONVERT函数用于转换字符串的字符集;所以我们可以利用中文的字符集是utf-8来判断。
上面介绍了如何判断某个字段字符串中是否有中文,在成功判断字段中是否有中文之后;那么该如何取出字段中的中文呢?
这里介绍一种快速准确的办法:
函数创建成功后,直接传jldw调用就可获取该字符的中文了。
源码如下:
create or replace function getCustText(custName varchar2) return varchar2 is
Result varchar2(100); --返回的结果字符串
tmp_custName varchar2(100); --临时变量
count_str number; --字符串中字符的个数
i number:=1; --循环变量
str_ascii number; --当前等待判断字符的ascii码
current_char varchar2(10); --当前等待判断的字符
begin
select length(custName) into count_str from al; --取出待处理字符串的长度
while i<count_str loop ---根据待处理字符串长度(counts)?,逐个字符判断处理
current_char:=substr(custName,i,1);
select ASCII(current_char) into str_ascii from al;
if str_ascii>45216 then
tmp_custName:=tmp_custName||current_char;
end if;
i:=i+1;
end loop;
Result:=tmp_custName;
return(Result);
end getCustText;