资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

oracle怎么去除中文字符,oracle去除指定字符

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规定的汉字编码范围之内

[PHP]

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..length(p_name) loop

if lengthb(substr(p_name,i,1))=2 then

v_comma := instrb(v_code,',');

v_code_q := to_number(substrb(v_code,1,v_comma-1));

v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));

if v_code_q=176 and v_code_q=247 and v_code_w=161 and v_code_w=254 then

v_chinese := v_chinese||substr(p_name,i,1);

end if;

v_code := ltrim(v_code,'1234567890');

v_code := ltrim(v_code,',');

end if;

v_code := ltrim(v_code,'1234567890');

v_code := ltrim(v_code,',');

end loop;

return v_chinese;

else

return '';

end if;

end;

/

.

[/PHP]

好,现在来执行一些语句

SQL select * from test;

NAME

--------------------

,啊OO10哈

你好aa

大家好aa/

☆大海123

★ABC

5 rows selected.

1. 列出有汉字的记录

SQL select name from test where length(get_chinese(name))0;

NAME

--------------------

,啊OO10哈

你好aa

大家好aa/

☆大海123

4 rows selected.

2. 列出有汉字的记录,并且只列出汉字

SQL select get_chinese(name) from test where length(get_chinese(name))0;

GET_CHINESE(NAME)

---------------------------------------------------------------------------

啊哈

你好

大家好

大海

4 rows selected.

需要说明的是GB2312共有6763个汉字,即72*94-5=6763

我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去

============

改写这个函数,可以提取非汉字或者汉字

该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字

[PHP]

create or replace function get_chinese

(

p_name in varchar2,

p_chinese in varchar2

) return varchar2

as

v_code varchar2(30000) := '';

v_chinese varchar2(4000) := '';

v_non_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..length(p_name) loop

if lengthb(substr(p_name,i,1))=2 then

v_comma := instrb(v_code,',');

v_code_q := to_number(substrb(v_code,1,v_comma-1));

v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));

if v_code_q=176 and v_code_q=247 and v_code_w=161 and v_code_w=254 then

v_chinese := v_chinese||substr(p_name,i,1);

else

v_non_chinese := v_non_chinese||substr(p_name,i,1);

end if;

v_code := ltrim(v_code,'1234567890');

v_code := ltrim(v_code,',');

else

v_non_chinese := v_non_chinese||substr(p_name,i,1);

end if;

v_code := ltrim(v_code,'1234567890');

v_code := ltrim(v_code,',');

end loop;

if p_chinese = '1' then

return v_chinese;

else

return v_non_chinese;

end if;

else

return '';

end if;

end;

/

.

[/PHP]

SQL select * from a;

NAME

--------------------

我们啊、

他(艾呀)是★们

他的\啊@

SQL select get_chinese(name,1) from a;

GET_CHINESE(NAME,1)

-----------------------------------------

我们啊

他艾呀是们

他的啊

SQL select get_chinese(name,0) from a;

GET_CHINESE(NAME,0)

-----------------------------------------

()★

\@

SQL

如何解决Oracle数据库中文乱码问题

一、pl/sql developer 中文字段显示乱码

原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的。

二、查看和修改oracle数据库字符集:

select userenv('language') from dual;

查询结果:

SIMPLIFIED CHINESE_CHINA.AL32UTF8

--修改oracle数据库字符集:(在SQL Plus中)

sql conn / as sysdba;

sql shutdown immediate;

database closed.

database dismounted.

oracle instance shut down.

sql startup mount;

oracle instance started.

total system global area 135337420 bytes

fixed size 452044 bytes

variable size 109051904 bytes

database buffers 25165824 bytes

redo buffers 667648 bytes

database mounted.

sql alter system enable restricted session;

system altered.

sql alter system set job_queue_processes=0;

如何利用oracle正则表达式去除字段中含有的汉字

我尝试着写了一个,如果都是只在前后有中文,那么这个应该可以。你试试,我这里可没有环境去测试。

SELECT regexp_substr(changpai, '[[:alnum:]]+') FROM huishou.dx_new_car;


分享文章:oracle怎么去除中文字符,oracle去除指定字符
文章分享:http://www.cdkjz.cn/article/hegpig.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220