從表里提取漢字, 需要考慮字符集, 不同的字符集漢字的編碼有所不同
成都創新互聯是一家集網站建設,秦皇島企業網站建設,秦皇島品牌網站建設,網站定制,秦皇島網站建設報價,網絡營銷,網絡優化,秦皇島網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
這里以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
一、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;
我嘗試著寫了一個,如果都是只在前后有中文,那么這個應該可以。你試試,我這里可沒有環境去測試。
SELECT regexp_substr(changpai, '[[:alnum:]]+') FROM huishou.dx_new_car;
網頁名稱:oracle怎么去除中文字符,oracle去除指定字符
本文路徑:http://vcdvsql.cn/article6/hegpig.html
成都網站建設公司_創新互聯,為您提供面包屑導航、網站策劃、營銷型網站建設、網站改版、手機網站建設、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯