1 结论
思路:
(1) 去除特殊字符,避免 '全角' 字符,'《》' 等字符的影响
(2) 依据:'中文字节长度 > 英文字节长度'
with t_source_string as
(select 1 id, '12中文abc!!' str from dual union all
select 2 id, '34abc!!》' str from dual)
select t.*
from t_source_string t
where lengthb(regexp_replace(t.str, '[[:punct:]]', '')) >
length(regexp_replace(t.str, '[[:punct:]]', ''));
2 详解
1. lengthb():"字节" 长度,1 个字母 = 1 个字节,1 个中文 = 2 个字节。
length() :"字符" 长度,1 个字母 = 1 个字符,1 个中文 = 1 个字符。
2. to_single_byte('x'):将 x 转换为 "半角"
to_multi_byte('x') :将 x 转换为 "全角"
半角全角主要是针对 "标点符号" 来说的,全角标点占两个字节,半角占一个字节.
3. 特别的,如 "《"、"》"
select lengthb('《') a,
length('《') b,
lengthb('》') c,
length('》') d
from dual;
select lengthb('!') 半角字节长度,
lengthb('!') 全角字节长度,
length('!') 半角字符长度,
length('!') 全角字符长度,
to_single_byte('!') 转半角,
to_multi_byte('!') 转全角
from dual;