oracle之字符集

全球化特性與字符集

數據庫的全球化特性是數據庫發展的必然結果,位於不一樣地區、不一樣國家、不用語言而使用同一數據庫愈來愈廣泛。Oracle數據庫提供
了對全球化數據庫的支持,消除不一樣文字、語言環境、曆法貨幣等所帶來的差別、使得更容易、更方便來使用數據庫。
 
21.1 Oracle全球化特性內容
            
Language support
Territory support
Character set support
Linguistic sorting
Message support
Date and time formats
Numeric formats
Monetary formats

在Oracle全球化特性中最重要的則是字符集,即便用何種字符集將數據存儲在數據庫中      

21.2 什麼是字符集

主要是討論兩個問題,一是字符如何存儲,二是字符如何顯示。好比單個英文字符、單個阿拉伯數據字,#、$等,美國ANSI使用的標準字符集則使用了一個單字節(7位)來表示。因爲世界各國和各個地區使用的符號的多樣性,僅有2的7次方(128)個單字節的碼點是不夠用的,所以就有須要多字節來表示各自不一樣的字符。
正是因爲上述緣由產生了不一樣的字符集的概念, 如美國使用的爲US7ASCII,西歐則使用的是WE8ISO8859P1,中國則是ZHS16GBK。

爲了統一世界各國字符編碼,統一編碼字符集的概念應運而生,這就是Unicode。

在Oracle中,幾種經常使用的Unicode爲UTF-8,AL16UTF16,AL32UTF8

21.3 Oracle所支持的字符集及分類

Oracle支持兩百多種字符集,包含了單字節、可變字節以及通用字符集等。
字符集一般根據使用的字節數來分類,主要分爲如下幾類

a.單字節字符集,如US7ASCII(7bit),WE8ISO8859P1(8bit),WE8DEC(8bit)
b.可變長多字節字符集,如JEUC,CGB2312-80
c.固定長多字節字符集,AL16UTF16
    
21.4 Oracle數據庫支持的Unicode字符集

1)數據庫字符集和國家字符集特性

Database Character Sets
主要是用做描述字符如何保存。

可存儲列的類型爲CHAR,VARCHAR2,CLOB,LONG
National Character Set:
主要是用於輔助Database Character Set。由於早期的數據庫中不少使用了單字節字符集,但隨着業務的發展,須要使用到諸如nchar,nvarchar等Unicode字符或者須要擴展到世界各地存儲不一樣的字符,所以輔助字符集應運而生。

可存儲的類型爲NCHAR,NVARCHAR2,NCLOB

2) Oracle數據庫支持的Unicode字符集
Character Set         Unicode Encoding    Database Character Set    National Character Set
-----------------------------------------------------------------------------------------------
UTF8                  UTF-8                     Yes                                      Yes(Oracle 9i and 10g only)
AL32UTF8              UTF-8                     Yes                                    No
AL16UTF16             UTF-16                    No                                      Yes
    
3) 字符集影響的數據類型

對於二進制數據類型,字符集的設置不影響該類型數據的存儲,如視頻、音頻等
受影響的數據類型爲:char,varchar2,nchar,nvarchar2,blob,clob,long,nclob

4)客戶端設置字符集的三個級別,優先級依次遞增。

Database Server< Instance< alter session command

21.5 相關NLS參數的設定
 
1.查看NLS參數,有三個視圖:

a.查看數據庫服務器中設定的NLS參數使用nls_database_parameters視圖;

SQL>  select * from nls_database_parameters;

PARAMETER                            VALUE
---------------------------- -----------------------------------
NLS_LANGUAGE                         AMERICAN
NLS_TERRITORY                        AMERICA
NLS_CURRENCY                         $
NLS_ISO_CURRENCY                     AMERICA
NLS_NUMERIC_CHARACTERS           .,
NLS_CHARACTERSET                     ZHS16GBK
NLS_CALENDAR                         GREGORIAN
NLS_DATE_FORMAT                      DD-MON-RR
NLS_DATE_LANGUAGE                AMERICAN
NLS_SORT                             BINARY
NLS_TIME_FORMAT                      HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT             DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT              HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT          DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY               $
NLS_COMP                             BINARY
NLS_LENGTH_SEMANTICS             BYTE
NLS_NCHAR_CONV_EXCP              FALSE
NLS_NCHAR_CHARACTERSET           AL16UTF16
NLS_RDBMS_VERSION                11.1.0.6.0
已選擇20行。

b.查看本次會話中設定及使用的NLS參數,nls_session_parameters視圖決定了session顯示信息的形式:
SQL> select * from nls_session_parameters;

c.查看視圖nls_instance_parameters,結果來自實例引導初始化參數文件有關,它和show parameter nls相應。
SQL> select * from nls_instance_parameters;

幾個重要的參數:
1)語言參數,nls_language:
受影響的參數有:

NLS_DATE_LANGUAGE
NLS_SORT

2)區域參數,nls_territory:
受影響的參數有:

NLS_CURRENCY
NLS_DUAL_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_DATE_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIMESTAMP_TZ_FORMAT

一般,在nls_language設定後,應爲nls_territory設定合理的值,假如語言設定爲簡體中文,地區設定爲澳大利亞則不太合理
對於使用一樣的語言不一樣國家或地區,好比英語,澳大利亞和英國,則nls_territory設定不一樣,則一樣影響相關參數如currency等

3)排序參數: nls_sort:

Order by指定字段的排序方法,缺省的是Binary, 通常是支持單字節字符集 而多字節的字符集排序則引入Linguistic Sorting

基於Binary排序,根據encode的二進制代碼排序。
基於語言排序,又分單一語言和多重語言

ALTER SESSION SET NLS_SORT=BINARY;
SELECT num,word,def FROM list ORDER BY NLSSORT(word,'NLS_SORT=FRENCH_M');

4)NLS_LANG變量的設定(客戶端環境變量)

NLS_LANG變量爲一個總控參數,控制了前面描述的nls_language和nls_territory的行爲
該參數能夠用於設定服務器和客戶端的language和territory值,也可設置客戶端輸入數據和顯示的字符集
只要設定了該參數,則其它參數就肯定了。固然也能夠只設定其中的一部分,另外,特別注意NLS_LANG只能在環境變量中設定。
該參數的格式爲:NLS_LANG = language_territory.charset  如:NLS_LANG=French_France.UTF8

在咱們的虛機環境下,環境變量文件/home/oracle/.bash_profile中描述了做爲客戶端的NLS_LANG

NLS_LANG="simplified chinese"_china.zhs16gbk,該參數分爲幾個部分來設定
NLS_LANG=AMERICAN_AMERICA.zhs16gbk 英文字符集

第一部分爲language,爲simplified chinese。
第二部分爲territory,爲china。一二兩部分必須用下劃線鏈接。
第三部分爲character set,爲zhs16gbk 二三兩部分必須用小數點鏈接。
        
其含義是語言是簡體中文,區域是中國,數據庫字符集是zhs16gbk。

另外日期格式缺省的是DD-MON-RR,咱們單獨定義了適合中國人使用的格式'YYYY-MM-DD HH24:MI:SS'

21.6 改變字符集

9i以前沒法改變字符集,9i後Oracle提供了掃描字符集的工具,但沒法保證其有效。

對於Database Character Set 在Unix平臺上Oracle提供的實用工具是:

數據庫字符掃描工具csscan
語言與文字掃描工具lcsscan

如:csscan system/systempassword full=y tocher=utf8

1)轉換數據庫字符集,前提是csscan成功
使用alter database character set命令。

2)轉換國家字符集,前提是轉換後的字符集必須是轉換前的字符集的超集。
使用alter database national character Set命令。


第二十三章 正則表達式

21.1 ORACLE中的支持正則表達式的函數主要有四個:

1,REGEXP_LIKE :與LIKE的功能類似
2,REGEXP_INSTR :與INSTR的功能類似
3,REGEXP_SUBSTR :與SUBSTR的功能類似
4,REGEXP_REPLACE :與REPLACE的功能類似

它們在用法上與Oracle SQL 函數LIKE、INSTR、SUBSTR 和REPLACE 用法相同,
可是它們使用POSIX 正則表達式代替了老的百分號(%)和通配符(_)字符。

21.2 POSIX 正則表達式由標準的元字符(metacharacters)所構成:

'^' 匹配輸入字符串的開始位置,在方括號表達式中使用,此時它表示不接受該字符集合。
'$' 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。
'.' 匹配除換行符以外的任何單字符。
'?' 匹配前面的子表達式零次或一次。
'+' 匹配前面的子表達式一次或屢次。
'*' 匹配前面的子表達式零次或屢次。
'|' 指明兩項之間的一個選擇。例子'^([a-z]+|[0-9]+)$'表示全部小寫字母或數字組合成的字符串。
'( )' 標記一個子表達式的開始和結束位置。
'[]' 標記一箇中括號表達式。

'{m,n}' 一個精確地出現次數範圍,m=<出現次數<=n,'{m}'表示出現m次,'{m,}'表示至少出現m次。
\num 匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。

21.3 字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數字。
[[:alnum:]] 任何字母和數字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[:punct:]] 任何標點符號。
[[:xdigit:]] 任何16進制的數字,至關於[0-9a-fA-F]。

各類操做符的運算優先級
\轉義符
(), (?:), (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和順序
|
*/

21.4 Oracle REGEXP_LIKE介紹和例子
--建立表
create table fzq (id varchar2(4),value varchar2(10));
--數據插入
insert into fzq values ('1','1234560');
insert into fzq values ('2','1234560');
insert into fzq values ('3','1b3b560');
insert into fzq values ('4','abc');
insert into fzq values ('5','abcde');
insert into fzq values ('6','ADREasx');
insert into fzq values ('7','123 45');
insert into fzq values ('8','adc de');
insert into fzq values ('9','adc,.de');
insert into fzq values ('10','1B');
insert into fzq values ('10','abcbvbnb');
insert into fzq values ('11','11114560');
insert into fzq values ('11','11124560');

--regexp_like
--查詢value中以1開頭60結束的記錄而且長度是7位
select * from fzq where value like '1____60';
select * from fzq where regexp_like(value,'1....60');

--查詢value中以1開頭60結束的記錄而且長度是7位而且所有是數字的記錄。
--使用like就不是很好實現了。
select * from fzq where regexp_like(value,'1[0-9]{4}60');

-- 也能夠這樣實現,使用字符集。
select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');

-- 查詢value中不是純數字的記錄
select * from fzq where not regexp_like(value,'^[[:digit:]]+$');

-- 查詢value中不包含任何數字的記錄。
select * from fzq where regexp_like(value,'^[^[:digit:]]+$');

--查詢以12或者1b開頭的記錄.不區分大小寫。
select * from fzq where regexp_like(value,'^1[2b]','i');

--查詢以12或者1b開頭的記錄.區分大小寫。
select * from fzq where regexp_like(value,'^1[2B]');

-- 查詢數據中包含空白的記錄。
select * from fzq where regexp_like(value,'[[:space:]]');

--查詢全部包含小寫字母或者數字的記錄。
select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');

--查詢任何包含標點符號的記錄。
select * from fzq where regexp_like(value,'[[:punct:]]');


21.5 REGEXP_REPLACE(字符串替換函數)

REPLACE 函數是用另一個值來替代串中的某個值。例如,能夠用一個匹配數字來替代字母的每一次出現。REPLACE 的格式以下所示:

原型:regexp_replace(x,pattern[,replace_string[,start[,occurence[match_option]]]])

每一個參數的意思分別是:

x 待匹配的函數
pattern 正則表達式元字符構成的匹配模式
replace_string 替換字符串
start 開始位置
occurence 匹配次數
match_option 匹配參數,這裏的匹配參數和regexp_like是徹底同樣的,可參考前面的一篇文章。

舉例來說:

SQL> select regexp_replace('hello everybody,051courses will be over soon,thanks.','b[[:alpha:]]{3}','one') from dual;

REGEXP_REPLACE('HELLOEVERYBODY,047COURSESWILLBEOVER
---------------------------------------------------
hello everyone,051courses will be over soon,thanks.



css

相關文章
相關標籤/搜索