字符串
Oracle支持4中类型的字符串:
固定长度 | 可变长度 | |
数据库字符集 | CHAR | VARCHAR2 |
国际字符集 | NCHAR | NVARCHAR2 |
数据类型 —— VARCHAR2
保存可变长度的字符串;当声明一个长度可变的字符串时,必须同时指定字符串的最大长度,可以从1 —— 32767 个字符。
在指定最大长度的时候,可以指定使用字符或者字节两种单位,但两种方式最终都会转换成以字节为单位定义长度。
VARCHAR2声明的常见格式是:
variable_name VARCHAR2(max_length [CHAR | BYTE]);
例如:
v_source_system varchar2(500);
v_source_system varchar2(500 CHAR);
如果指定一个VARCHAR2字符串的单位为字符时,那么最终这个字符串的字节数量是根据数据库字符集表示一个字符所使用的最大的字节数决定的。
如果在声明VARCHAR2类型的变量时忽略了CHAR或者BYTE限定符,则取决于数据库的初始化参数 NLS_LENGTH_SEMANTICS。
SQL> show parameter nls_length_semantics
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
与Oracle数据库中的VARCHAR2比较:
PL/SQL中VARCHAR2类型的变量的最大长度可以到32767个字节,比Oracle数据库中的VARCHAR2类型要长很多(4000字符)。当要把一个PL/SQL的VARCHAR2变量值保存到一个VARCHAR2的数据库列时,只会把变量的头4000个字符保留下来。
数据类型——CHAR
固定长度字符串。在声明固定长度字符串时,也要指定字符串的最大长度,也是从1——32767个字节(也是要比数据库中的CHAR类型要长得多2000个)。可以用字符或者字节为单位指定长度。
例如:
feature_name CHAR(100 BYTE);
feature_name CHAR(100 CHAR);
如果不指定字节还是字符,由数据库初始化参数NLS_LENGTH_SEMANTICS决定。
如果在声明字符串时没有指定长度,PL/SQL会声明一个只有一个字节的字符串,
feature_name CHAR;
因为CHAR是固定长度的,PL/SQL会把那些没有达到声明中指定的最大长度的值,用空白字符做右补齐处理。
String子类型(不常用)
PL/SQL支持一些子类型,这些类型不大可能会被调用:
子类型 | 等价的PL/SQL类型 |
CHAR VARYING | VARCHAR2 |
CHARACTER | CHAR |
CHARACTER VARYING | VARCHAR2 |
NATIONAL CHAR | NCHAR |
NATIONAL CHAR VARYING | NVARCHAR2 |
NATIONAL CHARACTER | NCHAR |
NATIONAL CHARACTER VARYING | NVARCHAR2 |
NCHAR VARYING | NVARCHAR2 |
STRING | VARCHAR2 |
VARCHAR | VARCHAR2 |
字符串类型的使用
字符串常量/字面量
直接在代码中放入一个字符串常量,把内容用一对单引号围起来就是一个常量:
'Brighten the corner where you are.'
如果一个字符串常量本身就带有单引号,就需要输入单引号两次:
'Aren''t you glad you''are learning PL/SQL with O''Reilly?'
或者使用自定义的字符串分隔符;使用q前缀,比如:
q'!Aren't you glad you'are learning PL/SQL with O'Reilly?!'
或者
q'(Aren't you glad you'are learning PL/SQL with O'Reilly?)'
使用Unicode方式指定某些字符,可以使用u前缀:
u'Pils vom fa\00DF: 1\20AC'
拼接字符串
可以使用CONCAT函数和拼接操作符 —— ||。
CONCAT函数:
CONCAT(string1, string2)
将2追加到1上。只要有一个传入的字符串时CLOB类型,则返回的类型也是CLOB。函数返回值的数据类型是能够保留最多信息的那个数据类型。
使用函数只能拼接两个字符串,而使用拼接操作符,可以连接多个字符串。
x := 'abc' || 'def' || "ghi";
如果要使用CONCAT,需要使用嵌套的CONCAT:
x := CONCAT(CONCAT('abc', 'def'), 'ghi');
处理大小写
内置函数:
UPPER 和 LOWER
这些函数能够通过一次调用完成大小写的强制转换。
字符串每个单词首字母大写,函数:
INITCAP
忽略大小写:
通过设置初始化参数 NLS_COMP 和 NLS_SORT 让所有的字符串比较都忽略大小写。
不区分大小写会导致对应的索引失效。
空字符串
Oracle会把空字符串按 NULL 处理。
例如:
DECLARE
empty_varchar2 VARCHAR2(10) := '';
BEGIN
IF empty_varchar2 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
END IF;
END;
输出:
empty_varchar2 is NULL
补齐/裁剪
补齐,使用函数:
LPAD 和 RPAD
在函数的参数中可以指定补齐所使用的字符串。当指定的补齐位数小于字符串长度时,发生裁剪。
裁剪,使用函数:
LTRIM , RTRIM 和 TRIM
LTRIM和RTRIM中可以指定要裁剪的字符或字符集。默认为空格
TRIM只能指定字符,不能使用字符集。
例如:
RTRIM(a, '.');
LTRIM(a, 'ABCDEFG abcdefg');
TRIM(LEADING '.' FROM x);
TRIM(TRAILING '.' FROM x);
TRIM(BOTH '.' FROM x);
或者
组合使用RTRIM和LTRIM代替TRIM:
RTRIM(LTRIM(x, 'abcdefg'), 'abcdefg');