Oracle不同字符集所佔位元組數不同問題解釋

2021-10-23 06:53:55 字數 667 閱讀 2427

前兩天遇到的乙個問題,兩個資料庫相同的表結構,做同步的時候,發生寫入資料報錯:   

【ora-01438】實際值的長度大於了資料庫裡某個字段允許的最大長度導致的插入失敗問題。

經過細緻的查詢後發現是資料庫定義的字符集不同造成的。

--資料庫伺服器字符集,**於props$,是表示資料庫的字符集。

select t.parameter,t.value from nls_database_parameters t where t.parameter ='nls_characterset';

gbk型別的資料庫中,乙個漢字佔2個位元組,乙個字母或資料佔乙個位元組。

utf-8型別的資料庫中,乙個漢字佔3個位元組,乙個字母或數字佔乙個位元組。

varchar2(10) 在gbk中可以放5個漢字而在utf8中只可以存放3個

檢視字元個數的函式length()  檢視位元組數的函式lengthb()

varchar2(10) 括弧中寫的是位元組數  nvarchar2(10)括弧中寫的是字元數

select length('您好趙趙'), lengthb('您好趙趙') from dual

單位元組字符集,多位元組字符集,Unicode

我們在這裡介紹一下字元型別。這裡有3種編碼模式對應3種字元型別。第一種編碼型別是單子節字符集 single byte character set or sbcs 在這種編碼模式下,所有的字元都只用乙個位元組表示。ascii是sbcs。乙個位元組表示的0用來標誌sbcs字串的結束。第二種編碼模式是多位...

多位元組字符集和寬位元組字符集區別

多位元組字符集 字元編碼可能是1個位元組 也可能是2個位元組 ascii碼占用1個位元組儲存 中文 unicode 等 占用2個位元組 it學吧 16進製制編碼 73 84 47 89 80 55 0 16進製制最高位為1 代表負數 當存在負數則會把兩個負數當做乙個中文字元 73 i 1位元組 84...

寬位元組字符集和多字符集

unicode 寬位元組字符集 1.如何取得乙個既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫microsoft visual c 的執行期庫包含函式 mbslen來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你...