substr,substrb函数剖析

来源:互联网 发布:matlab 矩阵怎么转置 编辑:程序博客网 时间:2024/05/28 03:02

说明:以下内容均整理自网络资料,以供日后参考学习之用:

 

数据库里的varchar2和char字段长度定义是有两种方式,按字节或按字符。

按字节定义长度的方式是:varchar2(n byte)或者char(n byte),这也是缺省的长度定义方式,也就是  说,平时我们用到的varchar2(n)或者char(n)都是按字节定义长度的。

按字符定义长度的方式是:varchar2(n char)或者char(n char),这样的定义方式可以确保字段有足够的空间储存需要的字符,无论这些字符的长度是多少字节。

 

我们遇到的这个错误的原因在于,数据库的字符集是多字节字符集,也就是说中文字符占多个字节,而源字段的内容都是中文,这样substr(**,1,50)的字节长度可能达到100,自然超过了目标表字段中的50了。

 

==================================================================================

SUBSTR(char,m[,n]):该函数用于取得字符串的子串,其中数字m是字符开始位置,数字n是子串长度。如果m是0,则从首字符开始,如果m是负数,则从尾部开始。

 

以上是教材中关于函数SUBSTR()的原始说明。

第一、并没有说明数字m和n在不同字符集下的涵义;

第二、教材中没有列出另一个函数SUBSTRB()。

从美国人的角度看,这两个函数执行的结果是一样的,但翻译此书的专家没有考虑到在不同字符集下特别是在中文字符集下的不同。

 

SUBSTR()在进行数字定位时是按照字符串所属字符集来认定的,汉字和字母都是1个字符。

SUBSTRB()则完全根据字节在确定,1个汉字为2个字节,当碰到半个汉字时,则用空格代替。当所取长度为奇数时,则自动舍弃最后一位字节。

========================================================

类似的还有,

length与lengthb 长度计算函数 

select length('你好') from dual         ----output:2

select lengthb('你好') from dual       ----output :4

Instr与Instrb 字符串查找函数 instr(原字符串,查的字符串,起始位置,第几个匹配) 返回字符串位置,找不到返回0 .

select instr('日日花前长病酒','花前',1,1) from dual     ----output:3

select instr('日日花前长病酒','花前',1,1) from dual     ----output:5

原创粉丝点击