日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle数据类型及存储方式——字符类型篇

發布時間:2025/3/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle数据类型及存储方式——字符类型篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注:這篇文章絕大部分都摘抄于袁光東先生的? <<oracle小組學習筆記>>.

下面會對各種字符類型作詳細解釋。

一. char 類型

oracle 可以定義1個char(n)類型的列,長度為n, 如果插入數據長度小于n,?? 會自動用空格補齊。? n<=2000

1.新建1個表test_char,只含1個列,類型是char(10).? 列名是colA.
?
2.向這張表插入一d數據。


注:最多只能插入10個字符 否則報錯。(廢話拉)

3.使用dump函數可以查看每1條數據的內部存儲結構。
注:dump 函數能查看數據在datafile存儲內容。


解釋一下:
Typ=96 表示數據類型的ID。? 其中char類型的id是96。
Len=10 表示所在的內部存儲的長度(用字節表示). 雖然第一行數據知存了1個字符'a',但是它還是占了10個字節的空間。
97,32,32,32,32,32,32,32,32,32? 表示內部存儲方式。 其實oracle的內部存儲方式是以ASCII碼來存儲的。

點解咁講? 因為97就是a的ASCII碼、。

可以用chr 函數把ASCII碼轉成字符:
?
反之,如果想知道1個字符的ASCII碼,可以用函數ascii:


而32是空格的ASCII碼。
所以由97,32,32,32,32,32,32,32,32,32 得知char類型是定長類型,它總會
用空格來填充以達到1個固定寬度。
所以用char類型來保存字符數據是比較浪費空間的,如果字符數據很長的話。

oracle 的數據類型長度單位是字節:
??
可見1個漢子在oracle 是占用了兩個字節的。
英文字母或符號只占用1個字節。
Char(10)最多可以存放5個漢字。


二. varchar2 類型
varchar2 是oracle 特有數據類型, 可以看成是sybase的varchar類型。
varchar2是按實際長度保存數據的。最多可以占用4000個字節。

1. 創建1個表,只有1列, 類型為varchar2, 長度為10。列名為colB.
?
2.插入一些數據
?
3. 用dump函數查看每一行的內部存儲結構。
?
Typ=1 說明varchar2類型在oracle中的類型編號為1
Len 代表了每一行數據所占用的字節數,可以睇到沒一行的len都唔同。
后面是 ASCII碼

由此可見,varchar2 是存多少就占用多少空間。比較節省硬盤空間,不會用空格來填充。



三. byte 和 char

從10g開始, 在字符類型的寬度定義時,可以指定單位。
Byte 就是字節
char 就是字符。

Varchar2(10 byte) 長度是10個字節。
varchar2(10 char) 長度是10個字符所占的長度。
char(10 byte)長度是10個字節。
char(10 char)長度是10個字符所占的長度

注: varchar2(10) 默認為 varchar2(10 byte)

而1個字符占用多少個字節。 是由當前系統所采用的字符集來決定的。
如1個漢子占用兩個字符。

查看當前系統所采用的字符集
??

如果在定義類型是,不指定單位,默認是按byte. 即系以字節為單位的。

采用char為單位的好處是,可以使用多字節的字符集。
比如, 在ZHS16GBK 字符集中, 1個漢字占兩個字符。

那么如果把table的某個column的長度定義為可存放10個漢字, 通過下面定義就可以了Create table table_name(col_name varchar2(10 char))
繼續實驗, 新建1張表, 包含兩列。1列采用byte為單位, 1列采用char為單位。?如上col_char 列,定義為可以存放10個字符。col_byte列, 定義為可以存放10個字節的字符。
當前的系統采用字符集為ZHS16GBK,所以1個漢字字符占兩個字節。
試著在表中插入一些數據。
如上, col_char 可以插入10個漢字(每個兩個字節), 而col_byte 可以插入10個字節(每個字母占1個字節)。而,當我們向col_byte 插入6個漢字時,就會報錯,因為6個漢字已經超出10個字節了。?
再看看col_char中每一行的存儲結構?可以見到,當我們向col_char插入10個漢字時,它的長度為20.盡管我們定義時采用varchar2(10,char)由此可見,oracle 是根據當前數據采用的字符集,每個漢字字符所占字節數X 字符 來決定了該字段所占的字節數。
在本例中(11g),varchar2(10, char) 并不等于 ?varchar2(20)?因為向col_char插入'aaaaaaaaaaa' (11個a)時會報錯, 因為已經超過11個字符!?
當采用多字節的字符集時,定義字段長度還是采用char 為單位為佳, 因為可以避免字段長度的問題。
當不知道當前數據采用的字符集,1個字符占用多少字節時,可以使用lengthb函數。注意與length函數的區別哦
四, char 還是 varchar
1.就建1張表,一列為char類型, 一列為varchar2類型, 長度都是20byte.
2.想該表的兩列都插入相同的數據。?3. 分別 以char_col 列和 varchar_col列為條件查詢?
睇起身貌似無咩區別。
5.在繼續睇下面的例子??上面可以睇出他們其實不一樣, char(20)類型會將 'Hello world' 變成 ‘Hello world ? ? ' 來存儲。 ? ? ? ??當對比 char類型的列 和 常量時, 兩邊都會做Rtrim 處理(刪掉右邊空格)所以select * from test_char_varchar where char_col = 'Hello World'相當于:select?*?from?test_char_varchar?where?rtrim(char_col)?=?rtrim('Hello World')
但是當char類型列和varchar2類型列對比時, ? 是不會做這種處理的既系?'Hello world' != ‘Hello world ? ? '?

如果要讓char_col 列 與varchar_col列相等, 有兩種辦法第一種是: 使用rtrim 把char_col列右邊的空格去掉。第二種是:使用rpad 把 varchar_col右邊用空格填充。?注意: 如果使用rtrim函數, 那么使用rtrim 函數的列的索引失效, 除非那個列的索引本身就是使用rtrim 的函數索引。此外還會綁定變量時出現問題。


五, nchar 和 nvarcahr2如果系統需要集中管理和存儲多種字符集, 就需要使用這兩種字符類型。 在使用nchar 和nvarchar2時, 文本內容采用國家字符集來存儲和管理,而不是當前數據庫的字符集。
這兩種類型的長度制定的是字符數,而不是字節數。NLS 國家語言支持(National Language Support)
在oracle 9i 以后的版本, 數據庫的國家字符集可以是: utf-8 和 AL16UTF-16兩種。
1.新建1個表, 有兩列, 類型分別是 nchar 和 nvarchar2 長度都是10.?2.插入一些數據?在9i 之前的版本,插入時加上N時, 在處理時跟普通方式有區別。但是在10g時已經有了改變,加不加N都一樣,這里只是為了測試。再插入一行數據
3. 查看每行 col_nchar列的存儲方式.??Typ=96 與char的類型編碼一樣。Len=20?每一行的長度都是20字節。 跟char 一樣都是定長。 但是char(10)長度是10,而nchar(10)長度? ? ? ? ? ? ?是20字節。也就是說,統統以兩個字節來表示1個字符。
150,72 表示陳0,97 表示'a'0,32 表示空格。
4. nvarchar2的存儲?Typ=1 與varcahr2一樣。但是每一行的len值都不全相同, 也就系講唔會用空格來填充。 與varchar2一樣每1個字符都會用兩個字節來存儲,跟nchar一樣b 存儲為 0.98陳希比 存儲為 150,72,94,12,107,212
5.nchar 與 nvarchar2的數據定義。?注意雖然類型是寫著nchar(10),實際上長度是20字節的。所以一張表某列如果能保證數據都是字母數字, 用char(10), 是比nchar(10)節省1半空間的。
需要注意的是: 在char(or varchar2) 和 nchar(or nvarchar2) 對漢字的實際存儲值是不一樣的,因為采用了不同的字符集,就會有不用的字符編碼。
?這是采用的字符集系統是ZHS16GBK可以很容易地把它轉成ascii碼高位*256(2的8次方) + 低位179*256 + 194 = 46018
而46018正好就是漢字’陳‘的 ascii碼?而在nchar 和 nvarchar2中, 采用的是UTF-8 或 UTF-16 的字符集。由上面例子得知漢字 '陳’ 在 nchar 中 存儲為 150,72. 與ascii碼是不兼容的。








總結

以上是生活随笔為你收集整理的Oracle数据类型及存储方式——字符类型篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。