看到網友問,怎么查詢表中某個字段數據是不是包含了全角字符啊? 這個問題涉及到幾個函數:to_single_byte、length和lengthb,我之前做開發的時候研究的是如何判斷一個字符串中是否包含中文,其實和這個本質是一樣的,且看實驗部分。
1 實驗部分
1.1 lengthb和length函數結合to_single_byte函數
---查找出含有漢字,嚴格的說是含有全角字符的行
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(to_single_byte(l.name)) l
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');
1.2 regexp_replace --替換其它字符為空
SELECT
l.id,
l.name
FROM xb_link l
WHERE regexp_replace(TRIM(l.name),
'([A-Za-z0-9]|[[:punct:]]|[[:space:]])',
'') IS NOT NULL;
1.3 to_multi_byte 函數--全是全角字符
---全是漢字
SELECT l.name,
to_multi_byte(l.name)
FROM xb_link l
WHERE l.name = to_multi_byte(l.name);
SELECT l.name,
to_multi_byte(l.name)
FROM xb_link l;
1.4 網友問題解答:某個字段數據是不是包含了全角字符?
我們做如下的實驗:
drop table aa;
create table aa (col varchar2(255));
SELECT * FROM aa for update;
SELECT a.col,
to_single_byte(a.col),
length(a.col),
lengthb(a.col),
length(to_single_byte(a.col)),
lengthb(to_single_byte(a.col))
FROM aa a
WHERE (lengthb(a.col) - length(a.col)) <>
(lengthb(to_single_byte(a.col)) - length(to_single_byte(a.col)));