在SQL Server資料庫中,資料類型主要分為兩類,分別為Unicode資料類型與非Unicode資料類型。通常情況下,如果資料庫中儲存的資訊有多種語言的話,則筆者建議大家採用Unicode資料類型,而不應該使用非Unicode資料類型。
一、採用Unicode資料類型的原因。
之所以需要在利用多種語言儲存的資料庫中採用Unicode資料類型,主要是為了一些特殊字元的相容性。如國內一家企業,在墨西哥、美國、加拿大、魁北克等國家都有客戶。那麼在系統中就需要記錄這些客戶的地址,以方便員工寄快遞等等。但是在地址資訊中往往含有某種語言的特殊字元。所以如果採用非Unicode資料類型時,很難保證資料庫系統能夠正確儲存這些特殊字元,並在下次讀取資料的時候進行正確的轉換。為此黨之使用字元列和字碼頁的時候,必須要當心,資料庫管理員要確保於資料庫一起安裝的字碼頁能夠處理多種語言的特殊字元。還有在運行某種語言的字碼頁時用戶端讀取另一種語言的字元時,要確保字元能夠被正確轉換。
如現在的不少應用軟體都支援多語種。通過用戶端的選擇,可以支援法語、俄語、日語、中文等等。也就是說,在資料庫中某個客戶的地址可能會以以上不同的語言來儲存,以實現系統的多語言環境。而有時候,用戶端可能是中文的,但是使用者需要把法文的地址儲存在資料庫中,此時資料庫管理員就需要確保法文地址(可能還有一些特殊的字元)能夠在資料庫中正確儲存;而當另外的一個使用者使用英文用戶端環境需要能夠正確讀取這個法文的地址。要實現這個需求的話,則在資料庫安裝的時候需要選擇Unicode資料類型。
二、Unicode資料類型的特點。
Unicode資料類型是一種將碼位印射到字元的標準。這個資料類型在設計的時候,就涵蓋了幾乎世界上所有語言的全部字元,所以在儲存或者讀取資料的時候,不需要不同的字碼頁來處理不同的字元集。為此在多語言環境下,也就可以順利儲存、讀取各種語言下的一些特殊字元。因為採用了Unicode資料類型,在儲存的時候就是以原始的資料儲存,在讀取的時候也是讀取原始的資料。無論在儲存還是在讀取的時候,都不需要進行額外的轉換,採用不同語言的用戶端所看到的資料庫中的資料是相同的字元。
在SQL Server資料庫中支援Unicode資料類型。資料庫將所有文字系統目錄資料儲存在包含Unicode資料類型的列中;表視圖預存程序等資料庫物件的名稱也儲存在Unicode列中。如此的話,在開發應用程式的時候,只需要使用Unicode資料類型,就可以避免所有不同語言的字碼頁在轉換過程中遇到的字元識別問題。
三、採用Unicode資料類型對效能的影響。
Unicode資料類型與非Unicode資料類型其在內部的實現機制上是不同的,為此對於資料庫的效能也有不同的影響。一般來說,採用非Unicode資料類型的資料庫要比採用Uncode資料類型的資料庫效能上來的優越。不過如果在設計資料庫的時候,索引等方面設計的比較好,那麼這個效能上的差距會很小。這是什麼意思呢?如果兩個資料庫,分別採用了Unicode資料類型與非Unicode資料類型。如果這兩個資料庫的索引等配製不怎麼合理,那麼兩個資料庫的效能差異就會比較大,採用非Unicode資料類型的資料庫系能要比採用Unicode資料類型的要高。但是如果兩個資料庫的索引設定的比較合理,那麼他們雖然採用了不同的資料類型,但是效能上的差異就會很小。這一點是資料庫管理員在部署資料庫系統是選擇資料類型所必須要瞭解的一個內容。
那麼他們為何有這些效能上的差異呢?主要是因為定序的差異所造成的。因為Unicode資料類型與非Unicode資料類型的定序不同。如預設情況下,所有的Unicode字元在資料庫中均採用2個位元組儲存。而對於非Unicode資料類型來說,則有的是以單位元組儲存,而有的是以雙位元組儲存。如所有非東亞語言和泰語均採用單位元組來儲存非Unicode字元。而從排序角度來說,單位元組字元的排序比雙位元組字元的排序效能要高的多。所以同一張表,採用資料類型不同,則他們的排序效能會有比較大的差異。表中的記錄越多,這個效能差異也會越大。不過通過合理設定索引的話,可以把這種差異降低到最低。
另外兩種資料類型採用的定序也不同。在SQL Server資料庫中,使用Unicode定序來執行用微軟定序定義的非Unicode資料的字串比較。由於這些規則比非Unicode定序複雜得多,所以它們更佔用資源。所以儘管Unicode定序的代價通常更大,但Unicode資料類型與微軟定序定義的非Unicode資料之間的效能差異一般情況下不會很大。資料庫使用非Unicode定序的唯一情況是對於使用資料庫定序定義的非Unicode資料。在這種情況下,排序和掃描通常比應用Unicode定序時快。Unicode定序應用於使用微軟定序或SQL定序定義的所有Unicode資料。通常情況下,通過最佳化索引也可以縮小這個效能上的差距。
所以說,只有在設計不合理的情況下,採用Unicode資料類型的資料庫與採取非Unicode資料類型的資料庫之間在效能上存在比較大的差異。而這些差異都可以通過最佳化資料庫效能來避免。不過話說回來,即使對資料庫進行了充分的最佳化,這個效能上的差異仍然存在,不可能徹底的消除。只是這個差異可能會比較小,小到可以忽視的程度。
四、在什麼時候該採用Unicode資料類型?
通常情況下,應該根據應用系統來判斷是否該採用Unicode資料類型。如果前台的應用軟體其設計的時候,有多語言應用環境的需求,在最好在資料庫安裝的時候,選擇採用Unicode資料類型。否則的話,即使在應用系統層面實現了多語言的支援,但是在顯示的時候,仍然可能會出現亂碼等非正常現象。另外即使應用軟體不支援多語言,但是在使用者在儲存資料的時候,如果需要用到儲存其他語言的字元時(如使用者可能直接從客戶網站上複製地址資訊來儲存),此時也需要讓資料庫採用Unicode資料類型。否則的話,這些其他語言的字元將無法正常儲存或者正常顯示。
另外需要注意的是,在是否需要採用Unicode資料類型的時候,其主要從使用者的需求出發,而其對效能的不利影響是放在次要位置上。因為如果使用者正的有這方面需求,這是屬於剛性需求。到目前為止,在資料庫中只有通過Unicode資料類型可以解決這方面的字元轉換與顯示問題,而沒有第二條路可以走。相反,Unicode資料類型對於資料庫效能的影響,則是可以通過最佳化資料庫來避免的。如可以對資料庫表中的索引進行最佳化、對SQL語句進行最佳化、對用戶端與伺服器端的字元轉換方式進行最佳化等等。通過這些最佳化手段可以讓Unicode資料類型對資料庫效能的不利影響降低到最低,達到可以忽略不計的地步。