日期:2014-05-16  浏览次数:20452 次

oracle判断中文

?

转自:http://blog.csdn.net/ATGC/article/details/2036799?

ORACLE写一函数,准确地判断字段是否含有汉字或者提取汉字等

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以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规定的汉字编码范围之内

create?or?replace?function?get_chinese(p_name?in?varchar2)?return?varchar2 as ??v_code?????varchar2(30000)?:=?''; ??v_chinese??varchar2(4000)??:=?''; ??v_comma????pls_integer; ??v_code_q???pls_integer; ??v_code_w???pls_integer; begin ??if?p_name?is?not?null?then ?????select?replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:?','')?into?v_code?from?dual?where?rownum=1; ?????for?i?in?1..
友情链接: 爱易网 云虚拟主机技术 云服务器技术 程序设计技术 开发网站 APP开发教程
Copyright © 2013-2024 爱易网页 当前在线:444人  网站在24分48秒内访问总人数:7399人 当前 53.75%  粤ICP备18100884号-2