Oracle 11g Release 1 (11.1) 单行函数——NLS 字符函数和返回数字值的字符函数
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions001.htm#autoId2
本文内容
- NLS 字符函数
- 返回数字值的字符函数
Oracle 字符函数包括:
- 返回字符值的字符函数
- NLS 字符函数
- 返回数字值的字符函数
NLS 字符函数
NLS 字符函数返回关于字符集的信息。NLS 字符函数包括:NLS_CHARSET_ID、NLS_CHARSET_DECL_LEN 和 NLS_CHARSET_NAME。
NLS_CHARSET_ID(string)
NLS_CHARSET_ID 函数返回字符集对应的 ID。string 参数是 VARCHAR2 值。'CHAR_CS' 的 string 值返回服务器数据库字符集 ID。'NCHAR_CS' 的 string 值返回服务器国际化字符集 ID。
无效字符集返回 null。
示例 1:演示 NLS_CHARSET_ID。
SQL> SELECT NLS_CHARSET_ID('ja16euc') FROM DUAL;
NLS_CHARSET_ID('JA16EUC')
-------------------------
830
SQL>
NLS_CHARSET_DECL_LEN(byte_count,'char_set_id')
NLS_CHARSET_DECL_LEN 函数返回一个 NCHAR 列的声明长度(也就是字符个数)。byte_count 参数是列的宽度。'char_set_id' 参数是字符集 ID。
示例 2:演示 NLS_CHARSET_DECL_LEN。当使用多字节字符集时,返回 200 个字节列的字符个数。
SQL> SELECT NLS_CHARSET_DECL_LEN(200, NLS_CHARSET_ID('ja16eucfixed')) as a
2 FROM DUAL;
NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EUCFIXED'))
--------------------------------------------------------
100
SQL>
NLS_CHARSET_NAME(number)
NLS_CHARSET_NAME 函数返回字符集 ID 对应的字符集名称。字符集名称作为 VARCHAR2 值以数据库字符集返回。
若数字无法识别为字符集的 ID,则返回 null。
示例 3:演示 NLS_CHARSET_NAME。
SQL> SELECT NLS_CHARSET_NAME(2) FROM DUAL;
NLS_CH
------
WE8DEC
SQL>
返回数字值的字符函数
返回数字值的函数可以把任何字符类型作为其参数。它包括:ASCII、INSTR、LENGTH 和 REGEXP_INSTR。
ASCII(char)
ASCII 函数返回 char 第一个字符的数据库字符集的十进制表示。
char 可以是数据类型 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2。返回值是 NUMBER 类型。若你的数据库字符集是 7 位 ASCII ,则该函数返回 ASCII 值;若数据库字符集是 EBCDIC 编码,则返回一个 EBCDIC 值。另外,没有相应的 EBCDIC 字符函数。
该函数不直接支持 CLOB 数据。但是,CLOB 数据可以隐式数据转换作为参数传递。
示例 4:演示 ASCII。返回 employees 表中字段 last names 以字母 L 开头的记录,L 的 ASCII 等价于 76。employees 表位于 Oracle OE schema。
SQL> SELECT last_name FROM employees WHERE ASCII(SUBSTR(last_name, 1, 1)) = 76;
LAST_NAME
-------------------------
Lorentz
Landry
Ladwig
Lee
Livingston
SQL>
INSTR(string,substring)
INSTR(string,substring,position)
INSTR(string,substring,position,occurrence)
INSTRB(string,substring)
INSTRB(string,substring,position)
INSTRB(string,substring,position,occurrence)
INSTRC(string,substring)
INSTRC(string,substring,position)
INSTRC(string,substring,position,occurrence)
INSTR2(string,substring)
INSTR2(string,substring,position)
INSTR2(string,substring,position,occurrence)
INSTR4(string,substring)
INSTR4(string,substring,position)
INSTR4(string,substring,position,occurrence)
REGEXP_INSTR(source_char,pattern)
REGEXP_INSTR(source_char,pattern,position)
REGEXP_INSTR(source_char,pattern,position,occurence)
REGEXP_INSTR(source_char,pattern,position,occurence,return_opt)
REGEXP_INSTR(source_char,pattern,position,occurence,return_opt,match_param)
REGEXP_INSTR(source_char,pattern,position,occurence,return_opt,match_param,subexpr)
INSTR 函数在 string 中检索 substring。该函数返回一个整数,指示 substring 在 string 中第一个匹配的位置。INSTR 利用由输入字符集自定义的字符计算字符串。INSTRB 使用字节,而不是字符。INSTRC 使用 Unicode 完整字符(Unicode complete characters)。INSTR2 使用 UCS2 编码点(UCS2 code points)。INSTR4 使用 UCS4 编码点(UCS4 code points)。
- position 是非零整数,指示 Oracle 数据库检索 string 中字符的开始位置。若 position 为负数,则 Oracle 从 string 末尾向后开始计算,并检索。
- occurrence 是整数,指示 Oracle 检索如何发生。occurrence 必须为正数。若 occurrence 大于 1,则数据库在 string 的第 occurrence 次检索到时返回。
string 和 substring 可以是任意数据类型 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB。返回值为 NUMBER 数据类型。
position 和 occurrence 必须是 NUMBER 类型,或是任何可以隐式转换成 NUMBER 的数据类型,并必须解析为整数。position 和 occurrence 的默认值为 1,意味着,Oracle 从 string 第一个字符开始检索,substring 第一次检索到时发生。返回值时相对于 string 的开始位置,而不是相对于 position。若检索不成功,则返回 0。
REGEXP_INSTR 函数是 INSTR 函数关于正则表达式的扩展函数。
示例 5:演示 INSTR。
SQL> SELECT INSTR('CORPORATE FLOOR', 'OR') "Instring1",
2 INSTR('CORPORATE FLOOR', 'OR', 3, 2) "Instring2",
3 INSTR('CORPORATE FLOOR', 'OR', -3, 2) "ReversedInstring"
4 FROM DUAL;
Instring1 Instring2 ReversedInstring
---------- ---------- ----------------
2 14 2
SQL>
LENGTH(char)
LENGTHB(char)
LENGTHC(char)
LENGTH2(char)
LENGTH4(char)
LENGTH 函数返回 char 的长度。该函数利用由输入字符集定义字符的长度。LENGTHB 使用字节,而不是字符。LENGTHC 使用 Unicode 完整字符(Unicode complete characters)。LENGTH2 使用 UCS2 编码点(UCS2 code points)。LENGTH4 使用 UCS4 编码点(UCS4 code points)。
char 可以是 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB 的任意类型。返回值是 NUMBER 类型。若 char 是 CHAR 类型,则长度包括所有空白。若 char 是 null,则返回 null。
LENGTHB 函数的限制:该函数仅支持单字节的 LOB。不能用在多字节字符节的 CLOB 和 NCLOB 数据上。
示例 6:演示 LENGTH。
SQL> SELECT LENGTH('CANDIDE') "Length in charactoers"
2 FROM DUAL;
Length in charactoers
---------------------
7
SQL>
备注
EBCDIC
EBCDIC(Extended Binary Coded Decimal Interchange Code,广义二进制编码的十进制交换码,读作 "ehb-suh-dik" 或 "ehb-kuh-dik")是 IBM 于1963 年- 64 年间推出的字符编码表,根据早期打孔机式的二进化十进数(Binary Coded Decimal,BCD)排列而成。
EBCDIC 是 IBM 为它更大型的操作系统而开发。在一个 EBCDIC 文件里,每个字符(字母或数字)被表示为一个 8 位的二进制。而 IBM 个人计算机和工作站不使用它们的 EBCDIC 编码,而是工业标准编码 ASCII 码。
EBCDIC 缺点是英文字母不是连续地排列,中间出现多次断续,为编写程序的人带来了一些困难。
UCS
UCS(Universal Character Set/Universal Multiple-Octet Coded Character Set,通用字符集)由 ISO 制定(ISO 10646 或 ISO/IEC 10646、ISO/IEC 10646-1、ISO/IEC 10646-2)。
UCS 包括所有其他字符集,保证与其他字符集的双向兼容。UCS 包含已知语言的所有字符。除拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的方块文字,以及大量的图形、印刷、数学、科学符号。
Unicode
Unicode(统一码、万国码、单一码、标准万国码)是计算机领域的业界标准。它对世界上大部分的文字系统进行了整理和编码,使电脑可以更为简化地呈现和处理文字。
Unicode 随通用字符集(Universal Character Set,UCS)标准而发展。Unicode 一直在不断改进,每个新版本都加入更多的新字符。Unicode 涵盖了除字形、编码方法、标准字符编码外,还包含字符特性,如大小写字母。
Unicode 由非营利机构——统一码联盟负责,致力于让 Unicode 取代既有的字符编码方案。因为,它们空间有限,不适用于多语环境。因此,Unicode 备受认可,并广泛地应用于电脑软件的国际化与本地化过程。
Unicode 与 UCS
历史上存在两个独立的尝试创立单一字符集的组织,即 ISO 和统一码联盟,因此最初制定了不同的标准。1991 年,两个项目的参与者都认识到,世界不需要两个不兼容的字符集。于是,开始合作,两者都同意保持码表兼容,并紧密地共同调整任何未来的扩展。
Unicode 标准包含了 ISO/IEC 10646-1 实现级别 3 的基本多文种平面。两个标准的所有字符都在相同的位置并且有相同的名字。ISO/IEC 10646 只不过是一个简单的字符集表。而 Unicode 标准,额外定义了许多与字符有关的语义符号学。Unicode 使用更为广泛。但一般认为,用于打印 ISO/IEC 10646-1 标准的字体在某些方面的质量,要高于 Unicode。
UTF-8 和 UTF-16
UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 可变长度字符编码,也是一种前缀码。可以用来表示 Unicode 标准中的任何字符,且其编码中的第一个字节与 ASCII 兼容。因此,它逐渐成为电子邮件、网页及其他储存或传送文字的应用中,优先采用的编码。
UTF-8 使用一到四个字节为每个字符编码:
- 128 个 ASCII 字符只需一个字节编码(Unicode 范围 U+0000 - U+007F)
- 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母,则需要二个字节编码(Unicode 范围 U+0080 - U+07FF)
- 其他基本多文种平面(BMP)的字符(包含大部分常用字)使用三个字节编码
- 其他极少使用的 Unicode 辅助平面的字符使用四字节编码。
对上面的第四种字符而言,UTF-8 似乎太耗费资源。
但 UTF-8 对所有常用的字符都可以用三个字节表示——UTF-16 编码。对第四种字符同样需要四个字节来编码,所以,是 UTF-8 更有效率,还是 UTF-16,视所使用字符的分布范围而定。不过,若使用一些压缩系统,如 deflate,则这些不同编码系统间的差异就微不足道了。若顾及传统压缩算法在压缩较短文字上的效果不大,可以考虑使用 Unicode 标准压缩格式(SCSU)。
互联网工程工作小组(IETF)要求所有互联网协议都必须支持 UTF-8 编码。互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8 编码。
ASCII
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码,读作 ˈæski' 或 ASS-kee)是基于拉丁字母的一套编码系统,国际标准 ISO/IEC 646。主要用于显示现代英语,其扩展版本EASCII 则可以勉强显示其他西欧语言。ASCII 是现今最通用的单字节编码系统,但有被 Unicode取代的迹象。
TAG: