ORACLE判别字段是否包含中文

简介:

    在ORACLE数据库中如何查找那些字段里面包含中文的数据记录呢,有时候就是有这样的特殊需求,下面整理了一些判别字段中包含中文记录的几个方法

 

1:使用ASCIISTR函数判别

 

ASCIISTR函数说明:

ASCIISTR返回字符的ASCII形式的字符串。非ASCII的字符被转化为\xxxx的形式。

使用ASCIISTR函数也是根据非ASCII字符会被转化这个特性来判别中文字符,只要里面包含中文字符,则必定会有\xxx这样的字符。且简体汉字的编码范围是B0A1 - F7FE.如下例子所示

CREATE TABLE TEST
(
    NAME_ONE   CHAR(24)
   ,NAME_TWO   VARCHAR2(24)
   ,NAME_THR   NCHAR(24)
   ,NAME_FOR   NVARCHAR2(24)
)
 
INSERT INTO TEST
SELECT 'abc10', 'abc20', 'abc30', 'abc40'         FROM DUAL UNION ALL
SELECT 'abc11', 'abc21', 'abc31', 'abc41'         FROM DUAL UNION ALL
SELECT 'abc12', 'abc22', 'abc32', 'abc42'         FROM DUAL UNION ALL
SELECT 'abc1!', 'abc2!', 'abc3!', 'abc4!'         FROM DUAL UNION ALL
SELECT 'abc1#', 'abc2#', 'abc3#', 'abc4#'         FROM DUAL UNION ALL
SELECT 'abc1$', 'abc2$', 'abc3$', 'abc4$'         FROM DUAL UNION ALL
SELECT 'ab测试1', 'ab测试2', 'ab测试3', 'ab测试4' FROM DUAL;

clip_image001

使用 ASCIISTR(NAME_ONE) LIKE '%\%' 就能判别那些有中文的记录。如下所示:

SELECT NAME_ONE FROM TEST WHERE ASCIISTR(NAME_ONE) LIKE '%\%' 

但是如果字段里面的非ASCII字符不仅仅有中文,例如还有日文之类,那么这个方法就不能准确判别了,如下所示,我插入一条包含日文的记录.

INSERT INTO TEST
 
SELECT 'abこんにちは1', 'abこんにちは2', 'abこんにちは3', 'abこんにちは4' FROM DUAL;
 
COMMIT;
 
 
SQL> SELECT NAME_ONE FROM TEST WHERE ASCIISTR(NAME_ONE) LIKE '%\%';
 
NAME_ONE
------------------------
ab测试1
abこんにちは1

 

2:使用CONVERT函数判别

CONVERT函数说明:

CONVERT(inputstring,dest_charset,source_charset)

   inputstring:要转换的字符串

     dest_charset:目标字符集

     source_charset:原字符集

SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
 
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               UTF8
 
SQL> SELECT NAME_ONE, NAME_TWO FROM TEST WHERE  NAME_ONE <> CONVERT(NAME_ONE, 'ZHS16GBK', 'UTF8');
 
NAME_ONE                 NAME_TWO                
------------------------ ------------------------ 
ab测试1                  ab测试2                
abこんにちは1            abこんにちは2     

clip_image002

 

3:使用函数length和lengthb来判别

  

    使用函数length与lengthb来判别,是基于中文字符占用2~4个字节,而ASCII字符占用一个字节,那么对比LENGTH与LENGTHB就 会不一样。这样就能判别字段中是否包含中文字符,但是跟ASCIISTR一样,如果里面的非ASCI字符包含非中文,它一样不能判别。依然有取巧嫌疑。

SELECT NAME_ONE FROM TEST WHERE LENGTH(NAME_ONE) != LENGTHB(NAME_ONE);

clip_image003

 

关于三者的性能,基本上都差不多,并没有那个性能要快一点。当然我没有详细、大量测试过,只是就某个案例的执行计划分析而已。

相关文章
|
7月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
147 2
|
7月前
|
SQL Oracle 关系型数据库
Oracle之如何限制字段内数据的录入
Oracle之如何限制字段内数据的录入
87 0
|
7月前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
105 0
|
7月前
|
存储 Oracle 关系型数据库
oracle 过滤字段中的中文,不再洋不洋土不土
oracle 过滤字段中的中文,不再洋不洋土不土
170 0
|
7月前
|
存储 Oracle 安全
Oracle 12c的不可见字段:数据的“隐形斗篷”
【4月更文挑战第19天】Oracle 12c引入了不可见字段,这是一种隐藏数据列的特性,用于增强数据安全性和实现业务逻辑。不可见字段在常规查询中不显示,但参与数据操作,适合存储敏感信息或内部元数据。创建时只需在列定义中指定“INVISIBLE”属性。虽然有其限制,如特定查询可能暴露,但正确使用能有效提升数据安全性。了解和利用这一功能对数据管理员至关重要。
|
7月前
|
Oracle 关系型数据库 数据安全/隐私保护
oracle 19c 密码字段
oracle 19c 密码字段
66 0
|
7月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
Oracle 关系型数据库
Oracle 根据某个字段获取第一条数据
Oracle 根据某个字段获取第一条数据
|
存储 Oracle 关系型数据库
Oracle——根据拼音首字母模糊查询某个字段
Oracle——根据拼音首字母模糊查询某个字段