2012年7月31日星期二

Oracle 11g Release 1 (11.1) 单行函数——NLS 字符函数和返回数字值的字符函数

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_IDNLS_CHARSET_DECL_LENNLS_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>

 

返回数字值的字符函数

返回数字值的函数可以把任何字符类型作为其参数。它包括:ASCIIINSTRLENGTHREGEXP_INSTR

ASCII(char)

ASCII 函数返回 char 第一个字符的数据库字符集的十进制表示。
char 可以是数据类型 CHARVARCHAR2NCHARNVARCHAR2。返回值是 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。该函数返回一个整数,指示 substringstring 中第一个匹配的位置。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 次检索到时返回。

stringsubstring 可以是任意数据类型 CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB。返回值为 NUMBER 数据类型。

positionoccurrence 必须是 NUMBER 类型,或是任何可以隐式转换成 NUMBER 的数据类型,并必须解析为整数。positionoccurrence 的默认值为 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 可以是 CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB 的任意类型。返回值是 NUMBER 类型。若 charCHAR 类型,则长度包括所有空白。若 charnull,则返回 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: