隱式轉換的發生條件
當來源資料的類型和目標資料的類型不同的時候,如果沒有轉換函式,就會發生隱式轉換,也稱自動轉換。當然,有些情況下有些類型是不可以發生轉換的,比如說從DATE類型轉換到NUMBER類型就會報錯。
隱式轉換的問題
第一, 隱式轉換的最大問題就是轉換時會導致索引的無效,進而可能導致全表掃描。當表的資料量很大的時候,產生會很大的效能問題。比如說,VARCHAR2和NVARCHAR2隱式資料類型轉換導致的效能問題:
http://www.oracleonlinux.cn/2012/07/varchar_nvarchar_implicit_change_data_type/
第二, 由於隱式轉換使得資料庫編程人員和DBA難以瞭解到究竟發生了怎樣的類型轉換,而且如果代碼很多很長的話要查出錯誤就需要費很大的勁。比如說,每一個函數都有輸入參數,如果函數的輸入資料的資料類型跟函數的輸入參數要求的資料類型不同的話,就會發生隱式轉換,如果這兩種類型之間不能轉換的話就會報錯。由於其錯誤發生得相當隱蔽,尋找起來也相當麻煩。
問題的解決
第一:使用轉換函式,也就是顯式轉換。
每一種資料類型都有一組專門針對該類型資料進行處理的函數。如TO_CHAR,TO_CLOB等。其中,最常用的有三個,也就是數實值型別、字元類型和日期類型資料之間的轉換。如下:
TO_CHAR:把DATE或NUMBER轉換成字串;
TO_DATE:把NUMBER、CHAR或VARCHAR2轉換成DATE。當用到時間戳記時,可以用到TO_TIMESTAMP或TO_TIMESTAMP_TZ。
TO_NUMBER: 把CHAR或VARCHAR2轉換成NUMBER。這裡需要注意的是,不能把DATE類型轉換成NUMBER類型;
第二:避免隱式轉換。
在資料庫設計的時候,最好遵循“資料是什麼類型,就把它設計成什麼類型的”的原則,比如說,不要可以把日期類型的資料設計成字元型。
還有一個原則就是,在相對安全的地方使用函數,比如說對數值使用串處理函數,而不對串使用算術運算函數。
另外,為了方便以後對程式進行檢查,最好在適當的地方標註出資料類型的自動轉換。
對於Oracle的資料類型,可以參考下面的文章:
http://ajita.iteye.com/blog/1424143