db2漢字儲存

2021-08-30 22:19:37 字數 1797 閱讀 5305

**:[url]

大家可能都知道,資料庫的varchar欄位在儲存中文時,字段最大長度和可以儲存的字元的最大數量可能是不相等的。

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

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

資料庫varchar字段長度設定測試報告

測試用例:

資料庫表:userinfo 字段:password varchar(32)

操作記錄:

執行sql:

insert into usrinfo(id,usr_id,password) values('***x','***x','我使中國熱我使中國熱我使中國熱我'); --失敗 16漢字

insert into usrinfo(id,usr_id,password) values('***x','***x','我使中國熱我使中國熱我使中國熱'); --成功 15漢字

update usrinfo set password='我使中國熱我使中國熱我使中國熱1' where id='***x'; --失敗 15漢字1數字

update usrinfo set password='我使中國熱我使中國熱我使中國熱a' where id='***x'; --失敗 15漢字1字母

update usrinfo set password='012345678901234567890123456789' where id='***x'; --成功 30數字

update usrinfo set password='01234567890123456789012345678901' where id='***x'; --成功 32數字

update usrinfo set password='012345678901234567890123456789我' where id='***x'; --失敗 30數字1漢字

update usrinfo set password='0123456789我使中國熱0123456789' where id='***x'; --成功 20數字5漢字

select length(password) from usrinfo where usr_id='***x' ---32

update usrinfo set password='0我1使2中3國4熱' where id='***x'; --成功

select length(password) from usrinfo where usr_id='***x' ---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!!

db2儲存過程批量插入資料 db2儲存過程批量更新

db2儲存過程批量更新 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

db2儲存過程批量插入資料 db2儲存過程批量提交

db2儲存過程批量提交 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

DB2儲存過程雜談

db2常用的異常處理方式分為三種 undo 回滾 exit 退出 continue 繼續執行 declare undo exit continue handler for 異常處理的物件可以為針對指定的sqlstate declare undo exit continue handler for s...