`

Oracle 中文记录 及 乱码 判断 说明

 
阅读更多


一. 判断记录中是否有中文

这个可以使用Length 和 Lengthb 函数。 这个在blog里有说明:

Oracle Length 和 Lengthb 函数说明

http://blog.csdn.net/tianlesoftware/article/details/6863797

这种方法使用与字符集为GBK的情况,其他情况不使用。在GBK 字符集下,中文的length 是1个字符,而lengthb 是2个byte。

示例:

select * from t where length(c1) != lengthb(c1);

二. 判断记录中是否有乱码

这里需要使用asciistr 函数,ASCIISTR 的官网说明:

http://download.oracle.com/docs/cd/E11882_01/server.112/e26088/functions014.htm#i1000190

ASCIISTRtakesas its argument a string, or an expression that resolves to a string, in anycharacter set and returns an ASCII version of the string in the databasecharacter set. Non-ASCII characters are converted to the form\xxxx, wherexxxxrepresentsa UTF-16 code unit.

ASCIISTR函数会把非ASCII 的字符转换成\xxxx 的格式,xxxx 是UTF-16的code unit。

示例:

SQL> select asciistr('/\/Davecome from 安?庆?') as str from dual;

/\005C/Dave come from \5B89?\5E86?

这里的’安’ 被转换成了\5B89,‘庆’被转换成了\5E86。

这里要注意一个特殊字符“\”,当它出现的时候转换后的码为“\005C”。

当然,我们也可以使用UNISTR函数,把asciistr 的结果反转回来,如:

SQL>select UNISTR('\5E86') from dual;

那么当我们的记录中存在中文乱码时,

select UNISTR('\FFFD') from dual;

注意一点:

执行以上SQL 不要在sqlplus 里执行,sqlplus 受本地环境影响。到第三方的工具(PL/SQL DEV 或者Toad)里测试。

那么当我们的中文记录变成乱码后,那么转成asciistr的值就会包含2种特殊符号: ? 和 \FFFD 对应的问号。我们只需要匹配这2种符号,就可以判断记录里是否有乱码了。

HelloJin 同学提供的判断乱码的存储过程:



该存储过程由HelloJin同学编写,感谢他的辛勤劳动。

这里的核心语句是:



Oracle Parallel Execution(并行执行)

http://blog.csdn.net/tianlesoftware/article/details/5854583

如果是因为复制导致的乱码,可以和源库进行匹配,然后使用replace函数替换掉乱码。

下面的SQL 可以处理库之间复制导致的乱码:



该代码同样由HelloJin 同学提供。


其他文档:

Common Character Sets Found in InternetEmails [ID 477967.1]

-------------------------------------------------------------------------------------------------------

Blog: http://blog.csdn.net/tianlesoftware

Weibo: http://weibo.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群:83829929(满) DBA5群: 142216823(满)

DBA6 群:158654907(满) DBA7 群:69087192(满)DBA8 群:172855474

DBA 超级群2:151508914 DBA9群:102954821 聊天 群:40132017(满)

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请


分享到:
评论

相关推荐

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

    asp.net知识库

    Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步提交事务(NET2.0) 其它 在.NET访问MySql数据库时的...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

    C#编程经验技巧宝典

    的值 52 <br>0069 求最大公约数 52 <br>0070 求最小公倍数 53 <br>0071 判断素数的算法 53 <br>0072 如何判断一个数是否是完数 54 <br>0073 歌德巴赫猜想的算法 54 <br>0074 八皇后...

Global site tag (gtag.js) - Google Analytics