一般,我們在Java層驗證字符串長度的時候,使用String.length()方法,無論中文還是英文,返回的長度都是一樣的。
但是,在插入數據庫後,有時候會報錯(長度越界)。
public class StringLength { public static void main(String[] args) { System.out.println("測試".length()); System.out.println("cs".length()); } }控制台顯示結果為:
2 2但是在數據庫中,根據數據庫字符集的不同,漢字所占的“位數”也不相同: 數據庫字符集 所占位數 WE8ISO8859P1 1 AL32UTF8 3 ZHS16GBK 2
所以,當我們設定一個字段username最長為3時,數據庫中必須這樣定義
WE8ISO8859P1 情況下 varchar(3) AL32UTF8 情況下 varchar(9) ZHS16GBK 情況下 varchar(6)這就要求我們在定義表的時候考慮到應用情況。
那麼如何查看當前數據庫的字符集呢?
select * from nls_database_parameters;當然,還需要注意,查看數據庫中字符長度和字節長度的問題,因為varchar類型定義的長度為字節長度。
varchar(3) 等價於 varchar(3 byte)所以,執行下邊代碼會出現:
select length('測試') from dual; --2 select lengthb('測試') from dual; --4 select length('cs') from dual; --2 select lengthb('cs') from dual; --2