關於數據庫中的字段長度

首先是字節和字符的問題

有些問題看似簡單,但如果長時間不用的話就會模糊甚至忘記(可能是基礎不太紮實,高手勿噴):

今天上網查找寫資料回顧下:

信息一:1個字節等於8個bit位,每個bit位又0/1兩種狀態也就是說一個字節可以表示256個狀態,計算機裏用字節來作爲最基本的存儲單位。一般來說,英文狀態下一個字母或數字(稱之爲字符)佔用一個字節,一個漢字用兩個字節表示。在不同的編碼方式下一個字符佔的字節書不太一樣。 

字節是計算機存儲信息的基本單位。

字符是指計算機中使用的數字和符號,包括:1、2、3、A、B、C、~!·#%……—*()——+等等。1個漢字字符存儲需要2個字節,1個英文字符存儲需要1個字節。

信息二:字符就是在計算機中使用的字、字母等的統稱。 

信息三:字節是存儲信息的單位 而所謂字符就是個符號,可以是多種多樣的符號


今天找了個沉默已久的帖子,作者做了些測試,覺得很系統就轉了下來(作者勿怪):

======================================================================================

大家可能都知道,數據庫的varchar字段在保存中文時,字段最大長度和可以保存的字符的最大數量可能是不相等的。

在Oracle中,varchar(100)可以保存50個純漢字或100個純字母或者數字。如果希望長度100的varchar保存100個漢字,可以將字段類型設置爲nvarchar(這個不太確定,但是oracle確實有這個功能。n表示國際化的意思)

而在db2尤其是as400服務器下的db2,是怎麼個情況,今天我們進行了一下測試。下面是測試報告:


                       數據庫VARCHAR字段長度設置測試報告
測試時間:2009-01-16 14:00
測試用例:
   數據庫表:UserInfo 字段:password varchar(32)

操作記錄:
執行SQL:
insert into usrinfo(id,usr_id,password) values('xxxx','xxxx','我使中國熱我使中國熱我使中國熱我'); --失敗 16漢字
insert into usrinfo(id,usr_id,password) values('xxxx','xxxx','我使中國熱我使中國熱我使中國熱'); --成功 15漢字
update usrinfo set password='我使中國熱我使中國熱我使中國熱1' where id='xxxx';  --失敗 15漢字1數字
update usrinfo set password='我使中國熱我使中國熱我使中國熱a' where id='xxxx';  --失敗 15漢字1字母


update usrinfo set password='012345678901234567890123456789' where id='xxxx';    --成功 30數字
update usrinfo set password='01234567890123456789012345678901' where id='xxxx';  --成功 32數字
update usrinfo set password='012345678901234567890123456789我' where id='xxxx';  --失敗 30數字1漢字


update usrinfo set password='0123456789我使中國熱0123456789' where id='xxxx'; --成功 20數字5漢字 
select length(password) from usrinfo where usr_id='xxxx' ---32 


update usrinfo set password='0我1使2中3國4熱' where id='xxxx'; --成功
select length(password) from usrinfo where usr_id='xxxx' ---25


結論:
  1 每個漢字佔用2個字符空間
  2 每段漢字再額外佔用2個字符空間(可能是辨別標識?)
  3 每個字母或數字佔用1個字符空間

----->假設需要保存1000個字(漢字、字母、數字都允許),那麼數據庫字段最少的長度應該是:
  最極限的情況是:單個漢字和字母(數字)連續間隔出現,即形式如下:
   漢1字2是3好a.......(假設總字符數是x,x是偶數)
  那麼漢字個數是x/2,字母數字個數是x/2,爲保證該字段的insert和update不報錯,字段最少的長度是===>
  x/2*2  漢字佔用字符數
  + 
  x/2*1  字母數字佔用字符數
  +
  x/2*2  每段漢字佔用的標識位數
  =2.5x

  ===================>>>所以,如果需求要求可輸入1000個字符,那麼數據庫保證不出錯誤的長度應該是2500,而不是我們通常認爲的2000!!!

======================================================================================================

以備以後查詢



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章