首页 » ORACLE 9i-23c » sql 判断字段值是是否包含中文字符

sql 判断字段值是是否包含中文字符

在itpub上看到了这个方法,我想修改一下,修改后如下

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 – F7FE
换算成10进制就是
B0 A1 F7 FE
176,161 – 247,254
先看一下asciistr函数的定义
Non-ASCII characters are converted to the form \xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 “\” 开始的字符就是汉字了
SQL> select * from test;

NAME
——————–
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;

NAME ASCIISTR(NAME)
——————– ———————-
,啊OO10哈 ,\554AOO10\54C8
你好aa \4F60\597Daa
大家好aa/ \5927\5BB6\597Daa/
☆大海123 \2606\5927\6D77123
★ABC \2605ABC

我们看到最后一条记录的实心五角星也是 “\”开头的
此时我们就不能用asciistr(字段)是否存在 “\” 来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内
anbob@ORCL> run
1 create or replace function f_getcn(p_name in varchar2) return varchar2
2 /*****************
3 discriber: 返回中文字符
4 byy:www.anbob.com itpub id: zhangweizhao
5 v_allcode_d 逗号前值
6 v_allcode_b 逗号后值
7 *******************/
8 as
9 v_allcode varchar2(30000) := ”;
10 v_chinese varchar2(4000) := ”;
11 v_allcode_d int;
12 v_allcode_b int;
13 begin
14 if p_name is not null then
15
16 for i in 1..length(p_name) loop
17 if lengthb(substr(p_name,i,1))=2 then
18 select substr(dump(substr(p_name,i,1)),instr(dump(substr(p_name,i,1)),’: ‘)+2) into v_allcode from dual;
19 v_allcode_d := to_number(substrb(v_allcode,1,instr(v_allcode,’,’)-1));
20 v_allcode_b := to_number(substrb(v_allcode,instr(v_allcode,’,’)+1));
21 if v_allcode_d>=176 and v_allcode_d<=247 and v_allcode_b>=161 and v_allcode_b<=254 then 22 v_chinese := v_chinese||substr(p_name,i,1); 23 end if; 24 end if; 25 end loop; 26 return v_chinese; 27 else 28 return ''; 29 end if; 30* end; Function created. anbob@ORCL> select * from testasc;

ID NAME REMARK
———- ———- ———————————————————–
1 我是anbob
1 我an是的bb
1 anbob

anbob@ORCL> col cn for a20
anbob@ORCL> run
1* select name,f_getcn(name) cn from testasc

NAME CN
———- ——————–
我是anbob 我是
我an是的bb 我是的
anbob

打赏

目前这篇文章有1条评论(Rss)评论关闭。

  1. Donnetta Levra | #1
    2011-12-21 at 06:18

    Hello there,guys,your website is really great! I like it.