Oracle PL/SQL 程序设计读书笔记 - 第8章 字符串
Oracle PL/SQL 程序设计读书笔记 - 第8章 字符串
8.1 字符串类型
- 固定长度数据库字符集:CHAR
- 可变长度数据库字符集:VARCHAR2
- 固定长度国家字符集:NCHAR
- 可变长度国家字符集:NVARCHAR2
8.1.1 VARCHAR2数据类型
当声明一个长度可变的字符串时,必须要同时指定字符串的最大长度,可以从1-32767个字节。在指定最大长度是可以使用字符或者字节两种单位来指定,但两种方式最终都会转换成以转换成以字节为单位定义长度。
variable_name VARCHAR2 (max_length [ CHAR | BYTE ]);
- 如果指定一个VARCHAR2的字符串最大长度时是以字符为单位的(CHAR这个限定词),那么最终这个字符串的字节数量是根据数据库字符集表示一个字符所使用的最大的字节数决定的。
- 数据在声明VARHCHAR2类型的变量时忽略了CHAR或者BYTE限定符,则长度到底该用字符还是该用字节来计算取决于数据库的初始化参数NLSLENGTHSEMANTICS。你可以通过查询NLSSESSIONPARAMENTERS来确定数据库的当前设置。
- PL/SQL中的VARCHAR2类型的变量的最大长度可以到32767个字节。比Oracle数据库中的VARCHAR2类型要长的多。
8.1.2 CHAR数据类型
- 如果在声明字符串时没有指定长度,PL/SQL会声明一个只有一个字节的字符串。
- 因为CHAR是固定长度的,PL/SQL会把那些没有达到声明中指定的最大长度的值,用空白字符做右补齐处理。
8.1.3 String子类型
- 子类型:CHAR VARYING 等价的PL/SQL类型:VARCHAR2
- 子类型:CHARACTER 等价的PL/SQL类型:CHAR
- 子类型:CHARACTER VARYING 等价的PL/SQL类型:VARCHAR2
- 子类型:NATIONAL CHAR 等价的PL/SQL类型:NCHAR
- 子类型:NATIONAL CHAR VARYING 等价的PL/SQL类型:NVARCHAR2
- 子类型:NATIONAL CHARACTER 等价的PL/SQL类型:NCHAR
- 子类型:NATIONAL CHARACTER VARYING 等价的PL/SQL类型:NVARCHAR2
- 子类型:NCHAR VARYING 等价的PL/SQL类型:NVARCHAR2
- 子类型:STRING 等价的PL/SQL类型:VARCHAR2
- 子类型:VARCHAR 等价的PL/SQL类型:VARCHAR2
8.2 使用字符串
8.2.1 字符串常量
- 把内容用一对单引号围起来就是一个常量。
-
如果一个字符串常量本身就带有单引号,你就需要输入单引号两次。或者指定自定义的字符串分隔符。利用q前缀就可以做到这点。
q'!ab'c!' a'{ab'c}'
就算是用了q前缀,你也必须要把字符串放在一对单引号中。紧跟在第一个引号之后的符号就是这个字符串的分隔符。
特别规则:如果开始的分隔符是[,{,<,(中的一个,则结束的分隔符就必须是对应的它们的结束符。
- 用国家字符集来表示一个字符串常量,可以使用n前缀。
-
如果使用Unicode代码点的方式去指定某些字符,可以使用u前缀。
u' fa\00DF'
-
在SQl*Plus或者 SQL Deveoper中字符串中&可能会有些问题(和工具相关),会自动解释成变量。可以使用SET DEFINE OFF
8.2.2 不可打印字符
可以使用CHR命令,例如:CHR(10)就是换行。ASCII函数是CHR的逆函数。
8.2.3 拼接字符串
把字符串拼接在一起可以用两种方法,分别是CONCAT函数和拼接操作符(两个竖线符号||)
8.2.4 处理大小写
- 强制字符串全部大写或小字(UPPER和LOWER)
- 忽略大小写的比较:从10gR2开始,可以通过设置初始化参数NLSCOMP和NLSSORT让所有的字符串比较都忽略大小写。这些参数的值结束是_CI就是忽略大小写的意思(Case Insensitivity)
- 字符串每个单词首字母大写:INITCAP
8.2.5 传统的检索,提取和替换
- INSTR函数可以 返回一个字符串在另一个更大的字符串中出现的字符位置。
- 字符串提取SUBSTR
- 字符串替换REPLACE
- 负的字符串位置。一些内置的字符串函数,允许从了符串的右侧开始反向计数方式来确定操作的开始位置。
8.2.6 补齐
- 可以用LPAD和RPAD在字符串的两边添加空格(或者是其他字符)使字符串达到指定长度。
- TRIM,LTRIM,RTRIM是裁剪操作。
8.2.7 正则表达式的检索,提取和替换
-
探查一个模式
REGEXPLIKE (sourcestring, pattern [, match_modiffier] )
-
source_string:代表要搜索的字符串
- pattern:是要从source_string搜索的正则表达式
- match_modifier:作用于搜索一个或多个修饰符,比如i表示不区别大小写
-
如果 在source_string中能够找到指定的模式,则返回TRUE,否则返回FALSE
-
定位一个模式
REGEXPINSTR (sourcestring, pattern [, beginning_position [,occurrence [,return_option [, match_modifier [,subexpression]]]]])
-
source_string:代表要搜索的字符串
- pattern:是要从source_string搜索的正则表达式
- beginning_position:代表开始搜索的字符串位置
- occurrence:是期待的出现序号,从1开始
- return_option:0代表开始位置;1代表结束位置
- match_modifier:作用于搜索一个或多个修饰符,比如i表示不区别大小写
-
subexpression:子表达式,从1开始
-
-
提取匹配模式的文本
REGEXPSUBSTR (sourcestring, pattern [, position [,occurrence [, match_modifier [,subexpression]]]])
-
source_string:代表要搜索的字符串
- pattern:是要从source_string搜索的正则表达式
- position:代表开始搜索的字符串位置
- occurrence:是期待的出现序号,从1开始
- match_modifier:作用于搜索一个或多个修饰符,比如i表示不区别大小写
- subexpression:子表达式,从1开始
-
如果没有发现匹配的模式,函数就返回NULL
-
-
正则表达式匹配计数
REGEXPCOUNT (sourcestring, pattern [, position [, match_modifier ]])
-
source_string:代表要搜索的字符串
- pattern:是要从source_string搜索的正则表达式
- position:代表开始搜索的字符串位置
-
match_modifier:作用于搜索一个或多个修饰符,比如i表示不区别大小写
-
-
文件替换
REGEXPREPLACE (sourcestring, pattern [, replacement_string [, position [,occurrence [, match_modifier ]]]])
-
source_string:代表要搜索的字符串
- pattern:是要从source_string搜索的正则表达式
- replacement_string:用来替换pattern的替换文本
- position:代表开始搜索的字符串位置
- occurrence:是期待的出现序号,从1开始
- match_modifier:作用于搜索一个或多个修饰符
-