Oralce 中漢字長度問題,oralce漢字長度問題
一般,我們在Java層驗證字串長度的時候,使用String.length()方法,無論中文還是英文,返回的長度都是一樣的。
但是,在插入資料庫後,有時候會報錯(長度越界)。
public class StringLength {public static void main(String[] args) {System.out.println("測試".length());System.out.println("cs".length());}}
控制台顯示結果為:
22
但是在資料庫中,根據資料庫字元集的不同,漢字所佔的“位元”也不相同:
資料庫字元集 |
所佔位元 |
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; --2select lengthb('測試') from dual; --4select length('cs') from dual; --2select lengthb('cs') from dual; --2
oracle中漢字顯示問題
加個n首碼比如n'中文‘試試
或者改變下當前資料庫的中文編碼
要想瞭解詳細的去這看看
www.cnblogs.com/...0.html
pl/sql中1個漢字所佔位元組長度為3的問題
問題癥結:
使用的字元集是UTF8,就會出現此錯誤!
你可以使用命令查看:
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER
------------------------------------------------
VALUE
------------------------------------------------
NLS_CHARACTERSET
AL32UTF8
解決方案:
建議使用ZHS16GBK字元集!
執行此操作後,問題即可得以解決。
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;