ORALCE substr函数及substrb与字符集关系
语法
函数用途: SUBSTR函数用来截取从源字符(参数 char)中截取一部分目标字符,截取方式为限定从源字符截取起始位置(参数 positon),并限定截取目标字符长度(参数 substring_length)。substr系列函数计算目标字符长度及开始截取字符位置长度的方式有所不同——substr函数为字符,substrb为字节,substrc为UNICODE完全字符集,substr2为UCS2编码代码点,substr4为ucs4编码代码点。
- 参数position为0时,按1处理。
- 参数position为正数时,ORACLE数所库查询时从左到右从第一个字符开始计数。
- 参数position 为负数时,查询从右向左从倒数第一个字符开始计数。
- 参数substring_length可为空,为空时直接从position位置开始向后截取所有字符(含position位置字符)。哪果substring为负值 ,则substr函数返还null。
char参数类型可以是 char,varchar2,nchar,nvarchar2,clob或者nclob,但除substr与substrb函数外,另外三个substr系列函数的参数char类型不允许 为CLOB(character large object) 或者NCLOB类型。position与substringlength参数数据类型必须是number数值型,或者可以被隐式转换为number型的数据类型,并且最终最必须可以被转换为整型。返回值的类型一般与char参数的数据类型一致,但char、nchar类型的参数返回值实际上分别为varchar2 、nvarchar2类型.position与substringlength参数如果为浮点型数据则被直接自动处理为整型数据。
示例:
1.
SELECT SUBSTR('ABCDEFG',3,4) "Substring" FROM DUAL;
以上语句返回'CDEF',即从第三个字符'C'开始,向右截取长度为4的目标字符,为'CDEF'.
2.
SELECT SUBSTR('ABCDEFG',-5,4) "Substring" FROM DUAL;
以上语句返回'CDEF',即从倒数第五个字符'C'开始,向右截取长度为4的目标字符,为'CDEF'.此处position参数为负值值是起始位置计算从右向左,但截取方向依然为从左向右,而instr(string,substring,position,occurence)函数position参数为负值 时,不仅取起始位置是从右向左,并且匹配计算目标字符串出现次数方向也是从右向左。
3.
SELECT SUBSTRB('ABCDEFG',5,4.2) "Substring with bytes" FROM DUAL;
substrb函数与substr函数不同之处在于它以字节来计数,而substr函数仅单纯以字符来计算,不论是中文还是英文。因此,由于数据库系统字符集编码方式的不一致,不同数据库系统执行上述语句结果可能有所不同。例3示例语句在GBK字符集下,字母占1字节,因此返还值为'EFG',即从第5个字节'E'开始,向右截取4个字节(不满4个截到末尾即可);而如果是UNICODE字符集,中英文均占2字节,因此返还值为'CD'.下面是一些常见的编码格式字符所占字节情况:
- 1、ASII:美国标准信息交换码,用一个字节的7位可以表示。无汉字字符,一个字母对应一个字节。;
- 2、ISO8859-1:拉丁码表,欧洲码表,用一个字节的8位可以表示;
- 3、GBK2312:中国的中文编码表,最多两个字节编码所有字符。一个汉字2字节,一个字母1字节;
- 4、GBK:中国的中文编码表升级,融合了更多的中文文字字符,最多两个字节编码。一个汉字2字节,一个字母1字节;
- 5、Unicode:国际标准码,融合了目前人类使用的所有字符,为每个字符分配唯一的字符码,所有的文字都用两个字节来表示;
- 6、utf-8:变长的编码方式,可用1-4个字节来表示一个字符。现在最多的又有6个字节。一个汉字3字节,一个字母1字节; -7、utf-16:中文和字母都是占2个字节。 -8、utf-32:中文和字母都是占4个字节。
ORACLE字符串存储方式
ORACLE数据库中varchar2类型字符串有varchar2(n char) 和varchar2(n byte)两种存放方式。一般直接定义为varchar2(n),这样ORALCE会根据配置文件中的设置选择以字节还是以字符为单位。查看具体是以哪种方式可能在PLSQL命令行输入以下命令查看value值:
show parameter nls_length
ORACLE字符集
可能通过以下语句查询当前登录数据库字符集:
elect userenv('language') from dual;
ORACLE的字符存储方式与字符集共同决定了一个varchar2型字段能存储什么长度什么形式的字符,比如:一个varchar2(4)长度的字段,如果 采用的是GBK编码方式,即一个汉字占2字节,字母占1字节,且存储方式为byte,则此字段最多存储2汉字,4字母。
参考文档 ORALCE官网 SQL Language Reference:https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/About-SQL-Functions.html#GUID-D51AB228-518C-4213-8BD4-F919623D105E