如何提取Oracle库表记录中的中文字符
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字符截取

更新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写一函数,准确地判断字段是否含有汉字或者提取汉字等

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以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截取字符串用法摘要: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数据库中文乱码问题解决

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获取汉字首字母

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
oracle截取字段部分内容的函数

oracle截取字段部分内容的函数Oracle是一种关系型数据库管理系统,提供了丰富的函数来处理和操作数据库中的数据。
本文将介绍几个常用的Oracle函数,用于截取字段中的部分内容。
1. SUBSTR函数SUBSTR函数用于截取字符串的一部分。
它的语法如下:```SUBSTR(string, start_position[, length])```其中,string是要截取的字符串,start_position是开始截取的位置,length是要截取的长度(可选)。
如果省略length参数,则SUBSTR函数将返回从start_position开始到字符串末尾的所有字符。
例如,假设有一个表名为employees,其中有一个名为name的字段,存储着员工的姓名。
我们可以使用SUBSTR函数截取姓名字段的前两个字符,如下所示:```SELECT SUBSTR(name, 1, 2) FROM employees;```这将返回所有员工姓名的前两个字符。
2. INSTR函数INSTR函数用于查找字符串中某个子字符串的位置。
它的语法如下:```INSTR(string, substring[, start_position[, nth_occurrence]]) ```其中,string是要查找的字符串,substring是要查找的子字符串,start_position是开始查找的位置(可选,默认为1),nth_occurrence是要查找的子字符串的第几个出现位置(可选,默认为1)。
例如,假设有一个表名为products,其中有一个名为description 的字段,存储着产品的描述。
我们可以使用INSTR函数查找描述中第一个出现的"Oracle"的位置,如下所示:```SELECT INSTR(description, 'Oracle') FROM products;```这将返回所有产品描述中第一个出现"Oracle"的位置。
Oracle截取字符串(截取固定分隔符中间的字符

Oracle截取字符串(截取固定分隔符中间的字符#### Oracle 截取字符串(截取固定分隔符中间的字符) ######## oracle 取固定分隔符之间的字符--⽅法⼀ substr+ instrSELECT substr('12JPX#4806(JP)',instr('12JPX#4806(JP)','#')+1,(instr('12JPX#4806(JP)','('))-(instr('12JPX#4806(JP)','#')+1) ) FROM dual 结果 4806--⽅法⼆正则表达式SELECT REGEXP_SUBSTR(REGEXP_SUBSTR('12JPX#4806(JP)','[^#]+',1,2,'i'),'[^(]+',1,1,'i') FROM DUAL;结果 4806注意!!!! : 如果⾸个符号为第⼀个时,#### 取字段包含A-Z的正则表达式⽤法select * from gaa_file t where regexp_like(t.gaa02,'^[A-Z]');#### 4GL 截取字符串(截取固定分隔符中间的字符) ########利⽤while循环取出⼀个包含多个'x'的字符串,最后⼀个'x'后⾯的字符 ####搞个while循环取出来WHILE TRUEIF guige.getIndexOf("x",1) THENLET guige = guige.substring(guige.getIndexOf("x",1)+1, guige.getLength())ELSEEXIT WHILEEND IFEND WHILE#### 取得固定分隔符前⾯的字符串... ####⽅法⼀:LET len_str = length(str1)LET index1 = 0LET str_ret=str1WHILE index1<len_strLET index1=index1+1IF str1[index1,index1]=p_flag THENLET str_ret=str1[1,index-1]EXIT WHILEEND IFEND WHILE⽅法⼆:FOR i=1 TO length(xxxx) STEP +1LET temp = xxx[1,i]IF temp LIKE '*/' THENRETURN temp[1,i-1]END IFEND FOR#### 4gl截取字符串进⾏判断 ####FOR li_i = pi_start TO pi_endLET ls_chk_chr = ps_source.getCharAt(li_i)IF ls_chk_chr NOT MATCHES "[0-9a-zA-Z]" THENLET li_result = FALSEEXIT FOREND IFEND FOR####以固定符号取出字符串中的内容(这⾥以'&'作为范例)####DEFINE l_tok base.stringTokenizer #080121DEFINE l_str LIKE type_file.chr1000DEFINE l_str1 LIKE type_file.chr1000LET l_str ="abasf&asdfa&asfa"IF NOT cl_null(l_str) THENLET l_tok = base.StringTokenizer.create(l_str,"&")WHILE l_tok.hasMoreTokens()LET l_str1 = l_tok.nextToken()END WHILEEND IF####以固定符号取出字符串中的内容(这⾥以'&'作为范例)####。
oracle截取字符(substr)检索字符位置(instr)示例介绍

oracle截取字符(substr)检索字符位置(instr)⽰例介绍⼀:理论oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使⽤收藏常⽤函数:substr和instr1.SUBSTR(string,start_position,[length])求⼦字符串,返回字符串解释:string 元字符串start_position 开始位置(从0开始)length 可选项,⼦字符串的个数For example:substr("ABCDEFG", 0); //返回:ABCDEFG,截取所有字符substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符substr("ABCDEFG", 0, 3); //返回:ABC,截取从A开始3个字符substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最⼤数量返回。
substr("ABCDEFG", -3); //返回:EFG,注意参数-3,为负值时表⽰从尾部开始算起,字符串排列位置不变。
2.INSTR(string,subString,position,ocurrence)查找字符串位置解释:string:源字符串subString:要查找的⼦字符串position:查找的开始位置ocurrence:源字符串中第⼏次出现的⼦字符串For example:INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字符串为'CORPORATE FLOOR', ⽬标字符串为'OR',起始位置为3,取第2个匹配项的位置;返回结果为 14 '⼆:实际测试select substr('OR:com.lcs.wc.placeholder.Placeholder:860825',INSTR('OR:com.lcs.wc.placeholder.Placeholder:860825',':', 1, 2)+1,length('OR:com.lcs.wc.placeholder.Placeholder:860825')) ,INSTR('OR:com.lcs.wc.placeholder.Placeholder:860825',':', 1, 2),length('OR:com.lcs.wc.placeholder.Placeholder:860825') From dual;测试成功。
中文编码提取方法

中文编码提取方法
中文编码提取方法通常涉及以下几个步骤:
1. 去除不属于GBK编码范围的字符。
这些字符包括[0 ~ 64),[127],[255]。
2. 从数组尾向数组头遍历,判断每个字符是否在[64 ~ 127)之内,如果该字符在范围内,且前一个字符不在[129 ~ 254]之内,则拿掉该字符。
如果该
字符是首字符(数组头),而且在[64 ~ 127]之内,直接拿掉。
3. 检查数组长度,如果长度为奇数,遍历整个数组,如果只有一个字符在[0 ~ 127]范围内,拿掉该字符。
4. 如果数组有[0 ~ 127]之间的字符,找到“第一个这样的字符”的位置。
如果该字符位置不是1,3,5等奇数位,拿掉(因为第二步已经确保数组
的首字符是GBK码了)。
5. 反复迭代这个过程N次。
6. 确保数组长度为偶数且全部是GBK编码。
现在可以“以两个字节为单位”提取汉字。
7. 每两个字节提取,判断范围如下,此范围之外,则拿掉。
这些步骤通常需要使用编程语言实现。
注意这个方法可能会去除一些不符合GBK编码的汉字,因此在处理需要保留所有汉字的情况时,可能需要使用其他方法。
oracle截取字段中的部分字符串

oracle截取字段中的部分字符串使⽤Oracle中Instr()和substr()函数:在Oracle中可以使⽤instr函数对某个字符串进⾏判断,判断其是否含有指定的字符。
其语法为:instr(sourceString,destString,start,appearPosition). instr('源字符串' , '⽬标字符串' ,'开始位置','第⼏次出现')其中sourceString代表源字符串;destString代表想聪源字符串中查找的⼦串;start代表查找的开始位置,该参数可选的,默认为1;appearPosition代表想从源字符中查找出第⼏次出现的destString,该参数也是可选的,默认为1;如果start的值为负数,那么代表从右往左进⾏查找,但是位置数据仍然从左向右计算。
返回值为:查找到的字符串的位置。
对于instr函数,我们经常这样使⽤:从⼀个字符串中查找指定⼦串的位置。
例如:SQL> select instr('yuechaotianyuechao','ao') position from dual;POSITION----------6从第7个字符开始搜索SQL> select instr('yuechaotianyuechao','ao', 7) position from dual;POSITION----------17从第1个字符开始,搜索第2次出现⼦串的位置SQL> select instr('yuechaotianyuechao','ao', 1, 2) position from dual;POSITION----------17-------------------------------------------------------------对于instr函数,我们经常这样使⽤:从⼀个字符串中查找指定⼦串的位置。
C#获取并写入ORACLE数据库中中英文字符集问题

C#获取并写⼊ORACLE数据库中中英⽂字符集问题
背景:
开发语⾔:C#
开发⼯具:VS2010
A⽅ORACLE数据库:中⽂字符集
B⽅ORACLE数据库:英⽂字符集
传递⽅式:webservice⽅式(取数据,并把取出的数据放到DataTable中,循环回写⼊B⽅的存储过程中)
问题:
从A⽅库⾥获取数据插⼊到B⽅库⾥写的存储过程⾥,到B⽅数据库后,汉字都变为乱码(问号较多)
解决⽅法:
⽅法⼀:最初从A⽅库取数据时⽤ORACLE的转换函数UTL_RAW.CAST_TO_RAW转换下该字段,即select
UTL_RAW.CAST_TO_RAW(a) from A
B⽅库⾥接收数据的存储过程应该⽤utl_raw.cast_to_varchar2()函数解析之后插⼊到B⽅库⾥
结果:B⽅库未接收到任何数据
⽅法⼀失败原因,经过跟踪⽅向直接查询select UTL_RAW.CAST_TO_RAW(a) from A在A⽅库⾥是显⽰出⼆进制码的,但是查询出的数据不能存到DataTable中,到DataTable中就变成了System.Data[],显⽰是查出的不是字符串造成的,由此想到把转换的数据查询时转换为字符串
⽅法⼆:
⽤ORACLE的字符截取函数来转换为字符串(to_char不可⾏),语句为:select
substr(UTL_RAW.CAST_TO_RAW(a),0,length(UTL_RAW.CAST_TO_RAW(a))) from A;B⽅库⾥接收数据时存储过程仍⽤
utl_raw.cast_to_varchar2()函数解析之后插⼊到B⽅库⾥
结果:汉字在B⽅库⾥显⽰正常。
从数据库中取中文数据的方法

从数据库中取中文数据的方法
在从数据库中取中文数据时,需要注意以下几点:
1. 数据库编码
首先需要确认数据库的编码方式是什么,一般而言,简体中文编码方式是utf-8,繁体中文编码方式是gb2312。
2. 字段编码
在查询数据库时,需要确认需要取出的字段编码方式是否一致,如果不一致,则需要在查询时进行编码转换。
例如,在django中,如果一个字段的数据类型为CharField,需要在查询时将该字段的值转换成unicode编码,才能正确地显示中文。
3. SQL查询
在SQL查询中,需要使用正确的语法来查询中文数据,通常情况下,可以使用LIKE或者等于号来查找中文数据。
例如:
SELECT * FROM table WHERE name LIKE '%中文%';
或者:
4. 编码转换
在程序中取出中文数据后,需要将其进行编码转换,以使其正确地显示在界面上。
例如,在使用Python编程时,可以使用decode函数将gbk编码转换成unicode编码:
'中文'.decode('gbk')
总之,从数据库中取中文数据需要注意编码方式的统一,SQL语法的正确使用以及编码转换的处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
至此,函数编写完成,编译后测试如下图:
有图有真相(哈哈)
经测试,此种方法虽然可解决一般的中文提取问题,但在大数据量的情况下,其执行效率的确不怎么高,还有待研究更加高效优化的方法。