2010-08-11

[Oracle][轉貼]Oracle [char、nchar、varchar、varchar2、nvarchar] 資料類型的區別

常常跟同事在討論這個問題,總是會被他們的回答搞的亂七八糟的,這篇寫的很清楚,拿來分享一下

資料來源:Oracle [char、nchar、varchar、varchar2、nvarchar] 資料類型的區別

1.CHAR是固定長度字符串型別, 注意Oracle資料庫內1byte並不等於一個字符, 因為Oracle一個字符會由1byte至4byte不等,要看Oracle資料庫的setting NLS_LENGTH_SEMANTICS而定. 如果定義為CHAR(10),當輸入’ABCDE’ 時,會以空白填滿到10個字符(即 ‘ABCDE’ + 5個空格),

2.NCHAR是專為unicode而設計的, 而每個字符佔多少個byte, 便要看Oracle的national characterset使用那一個字集而定, NCHAR同樣會自動以空格來填補, 當定義NCHAR(10)時,是可以輸入十個中文字(簡單來說一個中文字等於二個英文字母長度), 而NCHAR和CHAR並不能值接兼容,需要利用FUNCTION轉換,若由NCHAR轉換為CHAR,可使用TO_CHAR FUNCTION, 相反CHAR轉換為NCHAR,例如’ABCDE’這個CHAR字符, 便要使用N’ABCDE’來表示, (資料前面需要有一個N,代表是NCHAR型別),

3.VARCHAR是一種標準資料型別, 在其他資料庫內亦可見, 這個標準VARCHAR型別是可以儲存空白(即無資料), 但Oracle需然支援這個VARCHAR型別, 但亦自行再開發VARCHAR2型別, 而VARCHAR2型別是把空白轉為NULL值, 在ORACLE內使用VARCHAR2型別會比VARCHAR得到更大兼容性,這是官方既說法

4.VARCHAR2同CHAR的分別在於VARCHAR2為可變動長度,例如你定義VARCHAR2(10), 當輸入’ABCDE’時, Oracle會同樣儲存為ABCDE五個字符而不會像CHAR般自動填補

5.NVARCHAR亦跟NCHAR一樣是為unicode而設計的,但為可變動長度

6.何時用CHAR,何時用VARCHAR2, 便要跟據你所儲存的資料而定, CHAR的效能會比VARCHAR快,但CHAR會用多一點空間, 表示若你要效能,便要犧牲空間

7.VARCHAR2需然節省空間, 但當你的資料經常需要修改成不同長度時便需要注意, VARCHAR2會做成遷移(ROW MIGRATION)引起不必要的I/O

沒有留言:

張貼留言