成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Oracle中的BYTE和CHAR有什么區(qū)別呢?

Oracle定義字符串類型VARCHAR2和CHAR指定長度的用法如下:

成都創(chuàng)新互聯(lián)是專業(yè)的云巖網(wǎng)站建設公司,云巖接單;提供成都網(wǎng)站設計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行云巖網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

varchar2(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~4000之間的一個數(shù),表示最多占用4000字節(jié)的存儲空間。

char(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~2000之間的一個數(shù),表示最多占用2000字節(jié)的存儲空間。

那其中的BYTE和CHAR有什么區(qū)別呢

  • BYTE,用字節(jié)指定:VARCHAR2(10 BYTE)。這能支持最多10字節(jié)的數(shù)據(jù),在一個多字節(jié)字符集中,這可能只是兩個字符。采用多字節(jié)字符集時,字節(jié)與字符并不相同。

  • CHAR,用字符指定:VARCHAR2(10 CHAR)。這將支持最多10字符數(shù)據(jù),可能是多達40字節(jié)的信息。另外,VARCHAR2(4000 CHAR)理論上支持最多4000個字符的數(shù)據(jù),不過由于Oracle中字符串數(shù)據(jù)類型限制為4000字節(jié),所以可能無法得到全部4000個字符。

使用UTF8之類的多字節(jié)字符集時,建議你在VARCHAR2/CHAR定義中使用CHAR修飾會,也就是說,使用VARCHAR2(30 CHAR),而不是VARCHAR2(30),因為你的本意很可能是定義一個實際上能存儲30字符數(shù)據(jù)的列。還可以使用會話參數(shù)或系統(tǒng)參數(shù)NLS_LENGTH_SEMANTICS來修改默認行為,即把默認設置BYTE改為CHAR。不建議在系統(tǒng)級修改這個設置,而應該使用ALTER SESSION修改會話級。還有重要的一點,VARCHAR2中存儲的字節(jié)數(shù)上界是4000。不過,即使你指定了VARCHAR(4000 CHAR),可能并不能在這個字段中放下4000個字符實際上,采用你選擇的字符集時,如果所有字符都要用4個字節(jié)來表示,那么這個字段中就只能放下1000個字符!

下面使用一個小例子展示BYTE和CHAR之間的區(qū)別,并顯示出上界的作用。

測試環(huán)境11.2.0.4,是在多字節(jié)字符集數(shù)據(jù)庫上完成的,在此使用了字符集AL32UTF8,這個字符集支持最新版本的Unicode標準,采用一種變長方式對每個字符使用1~4個字節(jié)進行編碼

zx@ORCL>col value for a30
zx@ORCL>col parameter for a30
zx@ORCL>select * from nls_database_parameters where parameter='NLS_CHARACTERSET';

PARAMETER		       VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET	       AL32UTF8
zx@ORCL>show parameter nls_leng

NAME				     TYPE			       VALUE
------------------------------------ --------------------------------- ------------------------------
nls_length_semantics		     string			       BYTE

創(chuàng)建測試表

zx@ORCL>create table t (a varchar2(1),b varchar2(1 char),c varchar2(4000 char));

Table created.

現(xiàn)在,這個表中插入一個UTF字符unistr('\00d6'),這個字符長度為2個字節(jié),可以觀察到以下結果:

zx@ORCL>select length(unistr('\00d6')),lengthb(unistr('\00d6')) from dual;

LENGTH(UNISTR('\00D6')) LENGTHB(UNISTR('\00D6'))
----------------------- ------------------------
		      1 		       2

zx@ORCL>insert into t (a) values (unistr('\00d6'));
insert into t (a) values (unistr('\00d6'))
                          *
ERROR at line 1:
ORA-12899: value too large for column "ZX"."T"."A" (actual: 2, maximum: 1)

這說明:VARCHAR(1)的單位是字節(jié)而不是字符。這里確實只有一個Unicode字符,但是它在一個字節(jié)中放不下;將應用從單字節(jié)定寬字符集移植到一個多字節(jié)字符集時,可能會發(fā)現(xiàn)原來在字段中能放下的文本現(xiàn)在卻無法放下。第二點的原因是:在一個單字節(jié)字符集中,包含20個字符的字符串長度就是20字節(jié),完全可以在VARCHAR2(20)中放下。不過在一個多字節(jié)字符集中,20個字符的長度可以達到80字節(jié)(如果每個字符用4個字節(jié)表示),這樣一杰,20個Unicode字符很可能無法在20個字節(jié)中放下。你可能會考慮將DDL修改為VARCHAR2(20 CHAR),或在運行DDL創(chuàng)建表時使用前面提到的NLS_LENGTH_SEMENTICS會話參數(shù)。

插入包含一個字符的字段時觀察到以下結果:

zx@ORCL>insert into t (b) values (unistr('\00d6'));

1 row created.

zx@ORCL>col dump for a30
zx@ORCL>select length(b),lengthb(b),dump(b) dump from t;

 LENGTH(B) LENGTHB(B) DUMP
---------- ---------- ------------------------------
	 1	    2 Typ=1 Len=2: 195,150

這個INSERT成功了,而且可以看到,所有插入數(shù)據(jù)的長度(LENGTH)就是一個字符,所有字符串函數(shù)都以字符為單位工作。LENGTHB函數(shù)(字節(jié)長度)顯示出這個字段占用了2字節(jié)的存儲空間,另外DUMP函數(shù)顯示了這些字節(jié)到底是什么。這個例子展示了VARCHAR2(N)并不一定存儲N個字符,而只是存儲N個字節(jié)。

下面測試VARCHAR2(4000)可能存儲不了4000個字符

zx@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch   varchar2(1 char) := unistr('\00d6');
  4  begin
  5  l_date:=rpad(l_ch,4000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 6

在此顯示出,一個4000字符的實際上長度為8000字節(jié),這樣一個字符串無法永久地存儲在一個VARCHAR(4000 char)字段中,這個字符串能放在PL/SQL變量中,因為在PL/SQL中VARCHAR2最大可以達到32K。不過,存儲在表中,VARCHAR2則被硬性限制為最多只能存放4000字節(jié)。我們可以成功地存儲其中2000個字符:

zx@ORCL>declare
  2  l_date varchar2(4000 char);
  3  l_ch   varchar2(1 char) := unistr('\00d6');
  4  begin
  5  l_date:=rpad(l_ch,2000,l_ch);
  6  insert into t(c) values(l_date);
  7  end;
  8  /

PL/SQL procedure successfully completed.

zx@ORCL>
zx@ORCL>select length(c),lengthb(c) from t where c is not null;

 LENGTH(C) LENGTHB(C)
---------- ----------
      2000       4000

輸出可見,c占用了4000個字節(jié)的存儲空間。

本文題目:Oracle中的BYTE和CHAR有什么區(qū)別呢?
網(wǎng)址分享:http://jinyejixie.com/article32/pgegpc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、網(wǎng)站設計公司、虛擬主機、小程序開發(fā)、電子商務、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
安图县| 兴城市| 东乌珠穆沁旗| 雷波县| 兴城市| 泌阳县| 温州市| 禄劝| 南安市| 莫力| 家居| 台南县| 铁力市| 南京市| 青海省| 简阳市| 金沙县| 金溪县| 嵊州市| 呼图壁县| 新和县| 西昌市| 浦江县| 开远市| 永丰县| 南和县| 肇源县| 武宣县| 星子县| 兴海县| 富裕县| 南投市| 东乌珠穆沁旗| 精河县| 汉沽区| 孝义市| 西昌市| 台前县| 吉木萨尔县| 无极县| 西平县|