如何提取Oracle库表记录中的中文字符

合集下载

Oracle中如何用SQL检测字段是否包括中文字符

Oracle中如何用SQL检测字段是否包括中文字符

Oracle中如何用SQL检测字段是否包括中文字符
今天有一个同事的数据迁移程序有个问题,没有考虑中文编码字符,由于迁移的表有几千万数据,但是有中文的记录集很少,问我能否找出有中文内容的记录数。

首先我想到的是采用检测每个字节ASCII的方式,这样的话需要写一个自定义函数,然后SQL中调用得到结果。

但是感觉这个方法估计很耗时,毕竟每个字符都要比较,所以没有去实现。

突然想到Oracle有一个编码转换的函数叫Convert,如果一个字符串编码转换前后不一样就表示字符串里面含有非ASCII字符,这样就得到结果。

最后写出来测试了一下,确实可行,5500万记录10秒钟就扫描结束。

以下是测试用例:
SQL> select *
2 from (select 'abcd' c1 from dual
3 union all
4 select 'ab测试cd' c1 from dual)
5 where c1 <> CONVERT(c1, 'US7ASCII', 'ZHS16GBK');
C1
--------
ab测试cd
CONVERT函数说明:
CONVERT(inputstring,dest_charset,source_charset)
inputstring:要转换的字符串
dest_charset:目标字符集
source_charset:原字符集
这只是一个小技巧,也许有一天你也有这样的需求,或许能派上用场。

Oracle字符截取

Oracle字符截取

更新table表的name列为大写:
UPDATE table SET name = upper(name);
在程序中实现大写查询:
select * from table where name=upper('admin');
在程序中实现大小写忽略查训:
select * from table where upper(name)=upper('admin');
返回结果为:7
3、oracle,字母大小写转换 函数:upper()
功能:将字符串中的小写字母转换为大写字母。
语法:Upper( string )
参数string:要将其中的小写字母转换为大写字母的字符串返回值String。函数执行成功时返回将小写字母转换为大写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Upper()函数返回NULL。
INSTR的第三个参数为1时,实现的是indexOf功能。
INSTR的第三个参数为-1时,实现的是lastIndexOf功能。
例如:
INSTR('wenjin_文进_李_浩dsf', '_', -1, 1)
回结果为:12
ห้องสมุดไป่ตู้INSTR('wenjin_文进_李_浩dsf', '_', 1, 1)
1、截取长度
substr(字符串,截取开始位置,截取长度) //返回截取的字
例如:update tableA set colA=substr(colA,instr(colA,'$')+1) where colA like '%$%';

提取中英文数字字符两招搞定!

提取中英文数字字符两招搞定!

提取中英文数字字符两招搞定!前言当中文英文数字写在一个单元格时如何分开?这是很多人经常遇见的问题,条目不太多时,一般手动处理了事,条目多了如何去做,撸起袖子加油干,还是静下心来想一想有没有更好的方法?我们不讨论太复杂的情况,仅讨论任何两者混合的情况,如下:中文+英文,中文+数字,英文+中文,数字+中文,英文+数字,数字+英文上述六种情况,归纳起来只要学会两招即可搞定。

1第一招第一招可以对付上述前四种情况,即中文和其它字符混合,不论是数字还是英文字母,因为中文和其它字符不同的是,中文是双字节字符,其它为单字节字符。

利用这个规律可以确定中文字符的个数。

这里介绍一下跟字符相关的函数,注意在函数中有一些后面带B 的函数,如LEFTB,LENB等等,如果后面带B,则把一个中文字符当做两个来字节长度来看,不带B的函数则认为是一个字节长度。

LEN(文本):取文本字符串的长度,每一个字符长度为1。

LENB(文本):取文本字符串的长度,每个中文字符长度为2,其它字符为1。

RIGHT(文本,N):取字符串右边N个字符LEFT(文本,N):取字符串左边N个字符SUBSTITUE(文本,文本1,文本2):把文本中文本1的字符串替换成文本2我们假设一个文本字符串中有X个中文,Y个其它字符,那么可以有如下关系:LENB(文本)=2X+YLEN(文本)=X+Y解方程:X=LENB(文本)-LEN(文本)Y=2LEN(文本)-LENB(文本)知道中文字符和其它字符的个数,我们就可以根据字符在左或右,用LEFT或RIGHT函数求出对应的中文或其它字符。

也可以用SUBSTITUTE函数将字符串中的中文或英文替换成空值,取出另一半的字符。

2第二招第二招对应英文和数字的组合,因为英文和数字都是单字节字符,无法从字节上下手,但LOOKUP函数为我们提供了可能,在此向LOOKUP函数致敬。

常用的公式如下:数字在左:提取数字的公式:=LOOKUP(9E+307,--LEFT(文本,ROW($1:$100)))数字在右:提取数字的公式:=LOOKUP(9E+307,--RIGHT(文本,ROW($1:$100)))英文的字符长度等于字符串的长度-数字的长度,用LEFT或RIGHT函数求出。

提取单元格中的中文英文和数字

提取单元格中的中文英文和数字

提取单元格中的中文英文和数字一、提取字符串中的英文先来看下面的数据,是一些混到一起的客户信息,有姓名、英文名和住址,现在咱们要提取出其中的英文名。

有小伙伴可能首先想到的就是在2013及以上版本中的快速填充功能,嗯嗯,可以实现要求,但是这个功能有很大的局限性,第一是数据源变化后不能更新,第二是要求数据必须要有非常明显的规律性,否则结果就会出错,因此快速填充功能不是今天咱们讨论的主题。

熟悉函数公式的小伙伴应该在偷偷笑了,嗯嗯,函数公式也行,但是数据量多了的时候,函数公式直接歇菜,我可不想在电脑前面一直眼巴巴的等:咱们要分享的方法,不但可以刷新,而且在数据量非常多的时候仍然可以快速返回结果。

说了半天,究竟要使用什么方法呢?猜对了——就是Power Query功能。

接下来咱们就以Excel 2019为例,看看具体的步骤:1、单击数据区域,数据→自表格/区域,将数据加载到数据查询编辑器2、依次单击【添加列】→【自定义列】,输入公式:=Text.Remove([混合内容],{'一'..'龟'})然后删除原有的数据列,将数据加载到工作表。

Text.Remove 函数是PQ中特有的函数,Text表示函数的类型,Remove的意思就是移除。

函数的作用就是从字段中移除指定的字符。

这个函数有两个参数,第一个参数是要处理的字段,第二个参数是要移除的字符内容,公式中的{'一'..'龟'}表示所有中文字符,也就是说只要是中文字符,就从【混合内容】字段中移除。

二、提取字符串中的中文仍然以上面这组数据为例,要提取出其中的中文内容,也就是客户的姓名和地址信息。

1、单击数据区域,数据→自表格/区域,将数据加载到数据查询编辑器2、依次单击【添加列】→【自定义列】,输入公式:=Text.Remove([混合内容],{'A'..'z'})然后删除原有的数据列,将数据加载到工作表。

ORACLE写一函数,准确地判断字段是否含有汉字或者提取汉字等

ORACLE写一函数,准确地判断字段是否含有汉字或者提取汉字等

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312,环境变量(注册表或其它)的字符集也是GB2312编码并且保存到表里的汉字也都是GB2312编码的那么也就是汉字是双字节的,且简体汉字的编码范围是B0A1 - F7FE换算成10进制就是B0 A1 F7 FE176,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规定的汉字编码范围之内create or replace function get_chinese(p_name in varchar2) return var char2asv_code varchar2(30000) := '';v_chinese varchar2(4000) := '';v_comma pls_integer;v_code_q pls_integer;v_code_w pls_integer;beginif p_name is not null thenselect 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) loopif lengthb(substr(p_name,i,1))=2 thenv_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 thenv_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;elsereturn '';end if;end;/好,现在来执行一些语句SQL> select * from test;NAME--------------------,啊OO10哈你好aa大家好aa/☆大海123★ABC5 rows selected.1. 列出有汉字的记录SQL> select name from test where length(get_chinese(name))>0;NAME--------------------,啊OO10哈你好aa大家好aa/☆大海1234 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个,那五个是空的。

oracle substr截取字符串用法

oracle substr截取字符串用法

oracle substr截取字符串用法摘要:1.引言2.Oracle数据库介绍3.substr函数的作用4.substr函数的语法及参数5.substr函数的实例6.总结正文:在Oracle数据库中,字符串处理是非常常见的操作。

有时候,我们需要从字符串中截取一段特定的部分,这时就可以使用Oracle内置的substr函数。

本文将详细介绍substr函数的用法以及在实际场景中的应用。

首先,我们需要了解Oracle数据库。

Oracle是一种关系型数据库管理系统,广泛应用于各种企业和组织的数据存储和管理。

在Oracle中,有许多内置函数可以方便地对字符串进行处理,substr函数就是其中之一。

substr函数的作用是从一个字符串中截取一段指定的长度。

它的语法如下:```SUBSTR(string, m, n)```其中,string表示要截取的字符串;m表示从字符串的哪个位置开始截取(默认为1);n表示要截取的长度。

注意,m和n的值都是基于1的。

下面,我们通过一个实例来详细了解substr函数的用法。

假设我们有一个名为“employees”的表,其中有一个名为“job_title”的字段,我们想要从该字段中截取职位的前两个字符。

可以使用如下SQL语句:```SELECT SUBSTR(job_title, 1, 2) AS job_title_prefixFROM employees;```执行上述SQL语句后,我们将会看到“job_title_prefix”列中显示了从“job_title”字段中截取的前两个字符。

总之,在Oracle数据库中,substr函数是一个非常有用的字符串处理函数。

通过灵活地使用substr函数,我们可以轻松地从字符串中截取特定长度的一段。

kettle从oracle取出blob中文乱码

kettle从oracle取出blob中⽂乱码需要做⼀个任务,将某些的服务xml取出来重新调⽤,xml存在oracle中是blob类型的,sql取出来中⽂乱码。

查了⽹上的很多⽅法,改了配置⽂件的编码,改了数据库编码都不⾏。

1。

然后正好那段xml不⼤,投机了⼀把写查询语句的时候直接使⽤了utl_raw.cast_to_varchar2函数,然后把这个作为⼊参去调⽤服务。

2. 针对其他⼊参较⼤的就不⾏了。

增加了⼀个字段选择,将blob字段类型选择为String,Encoding选为GBK即可。

下⾯是查询过程中花了48积分下载的,不知道对你们有没有⽤:1.插⼊ (⽤PrepareStatement,⽤?占位)File file=new File();InputStream in=new BufferedInputStream(new FileInputStream(file));ps.setBinaryStream(1,in,(int)file.length());2.读取Blob blob=rs.getBlob(字段);//IuputStream in=blob.getBinaryStream(字段); //两种⽅式IuputStream in=rs.getBinaryStream(字段);File file=new File(⽂件位置等);OutputStream out=new BufferedOutputStream(new FileOutputStream(file));byte [] bt=new byte[1024];for(int=0;i=in.read(bt)>0;){out.write(bt,0,i);}out.close();in.close();。

oracle用函数unistr将Oracle数据库中的Unicode转换为中文

封装:
/** * unicode转中文 */ CREATE OR REPLACE FUNCTION UNICODE2CHINESE(ENCODE_TEXT IN VARCHAR2) RETURN VARCHAR2 IS V_SQL VARCHAR2(10000); --编码转换sql TEXT_BUFFER VARCHAR2(10000); --输出中文 BEGIN V_SQL := 'select unistr(REPLACE(''' || ENCODE_TEXT ||
2:保留全部的中文
select regexp_replace('我爱你中国232、。,我爱你895', '[^' || unistr('\0391') || '-' || unistr('\9fa5') || ']','') from dual;
Oracle Unicode转中文(解码)
情景描述:
将数据库中的某个字段误存储的是Unicode编码,需要将其改成中文。
测试:
--将Unicode转中文 select unistr(REPLACE('\u6d4b\u8bd5unicode\u8f6c\u4e2d\u6587','\u','\')) from dual;
结果是:测试unicode转中文
实现:
--对某字段进行解码 update tableName set columnName = unistr(replace(columnName,'\u','\'));
''',''\u'',''\'')) from dual '; EXECUTE IMMEDIATE V_SQL

Oracle数据库中文乱码问题解决

5.重 新 启 动 PLSQL,插 入 数 据 正 常
3.设 置 环 境 变 量 计 算 机 ->属 性 ->高 级 系 统 设 置 ->环 境 变 量 ->新 建 设 置 变 量 名 :NLS_LANG,变 量 值 :第 1步 查 到 的 值 , 我 的 是 AMERICAN_AMERICA.ZHS16GBK
4.去 虚 拟 机 修 改 注 册 表 值 , 修 改 NLS_LANG为 服 务 器 端 查 询 到 的 值 。 修 改 以 后 重 新 启 动 一 下 下 图 所 示 的 两 个后台服务
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
Or器 端 编 码 select userenv('language') from dual; 我 实 际 查 到 的 结 果 为 :AMERICAN_AMERICA.ZHS16GBK 2.执 行 语 句 select * from V$NLS_PARAMETERS , 查 看 第 一 行 中 PARAMETER项 中 为 NLS_LANGUAGE 对 应 的 VALUE项 中 是 否 和 第 一 步 得 到 的 值 一 样 。 如果不是,需要设置环境变量。

ORACLE获取汉字首字母

V_RETURN := V_RETURN || 'N';
ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚') THEN
V_RETURN := V_RETURN || 'O';
ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝') THEN
V_RETURN := V_RETURN || 'L';
ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧') THEN
V_RETU9;;
ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧') THEN
V_RETURN := V_RETURN || 'C';
ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽') THEN
V_RETURN := V_RETURN || 'D';
ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲') THEN
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何提取Oracle库表记录中的中文字符
今日头条没事儿唠唠IT 2016-12-01 00:17
在最近做的一个项目中,需要将数据库表中的中文字符提取出来,以供业务人员二次处理。

网上搜索一番后,采用Oracle数据库的ASCII函数解决问题。

主要思路整理如下:
由于中文字符的ASCII码范围为45217至63486之间,因此可以此为切入点对目标字符串进行判断截取。

编写函数如下:
create or replace function getCNStr(str varchar2)
return varchar2 is
tmpStr varchar2(100); --临时变量
currentStr varchar2(10); --当前待判断处理的字符
asciiCode number; --当前待怕短处理字符的Ascii码
counts number; --字符串中的字符个数
i_loop number := 1; --循环变量
resultStr varchar2(200); --返回的结果字符串
begin
--取出待处理字符串的长度(counts)
select length(str) into counts from dual;
--根据待处理字符串长度(counts),逐个字符判断处理
while i_loop <= counts loop
currentStr := substr(str, i_loop, 1);
select ASCII(currentStr) into asciiCode from dual; if asciiCode >= 45217 then
tmpStr := tmpStr || currentStr;
end if;
if asciiCode <= 45216 then
--非连续的中文字符串之间以空格隔开
tmpStr := tmpStr || ' ';
end if;
i_loop := i_loop + 1;
end loop;
resultStr := tmpStr;
return(resultStr);
end getCNStr;
至此,函数编写完成,编译后测试如下图:
有图有真相(哈哈)
经测试,此种方法虽然可解决一般的中文提取问题,但在大数据量的情况下,其执行效率的确不怎么高,还有待研究更加高效优化的方法。

相关文档
最新文档