本文中length代表的是字的长度,lengthb是字节的长度,字符集为ZHS16GBK。
第一种方法:不太准确,只能判断含有双字节字符
SQL> create table test (name varchar2(100));
表已创建。
SQL> insert into test values ('ABC已连接');
已创建 1 行。
SQL> insert into test values ('ABC');
已创建 1 行。
SQL> select name from test where length(name)!=lengthb(name);
NAME
--------------------------------------------------------------
ABC已连接
SQL> select name from test where length(name)=lengthb(name);
NAME
--------------------------------------------------------------
ABC
第二种方法:
gbk编码范围是4e00-9fa5
生成编码范围内的所有汉字(见附件),将每一个汉字作为一行存入表test。
SQL> select count(*) from test;
COUNT(*)
----------
20902
SQL> select min(name) from test;
MIN(NAME)
-------------------------------------------------------------------
丂
SQL> select max(name) from test;
MAX(NAME)
-------------------------------------------------------------------
龥
SQL> select count(*) from test where regexp_like(name, '[丂-龥]');
COUNT(*)
----------
20902
SQL> delete from test;
已删除20902行。
SQL> commit;
提交完成。
SQL> insert into test values ('abc');
已创建 1 行。
SQL> insert into test values ('a测试bc');
已创建 1 行。
SQL> insert into test values ('a测试');
已创建 1 行。
SQL> insert into test values ('测试bc');
已创建 1 行。
SQL> insert into test values ('测ab试');
已创建 1 行。
SQL> insert into test values ('测a试b');
已创建 1 行。
SQL> insert into test values ('def');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select name from test where regexp_like(name, '[丂-龥]');
NAME
----------------------------------------------------------------
a测试bc
a测试
测试bc
测ab试
测a试b
SQL> select name, regexp_instr(name, '[丂-龥]') as position from test;
NAME POSITION
---------------------------------------------------------------------------
abc 0
a测试bc 2
a测试 2
测试bc 1
测ab试 1
测a试b 1
def 0
已选择7行。