欄「相似性」 是該欄中資料的建議儲存類型。在欄中儲存值時 (透過 INSERT 或 UPDATE 陳述式),執行階段會嘗試將該值從其資料類型轉換為指定的相似性。例如,如果將 Date 值 (ActionScript 或 JavaScript Date 實體) 插入相似性為 TEXT 的欄,該 Date 值就會轉換為 String 形式 (等於呼叫物件的 toString() 方法),然後再儲存到資料庫中。如果該值無法轉換為指定的相似性,就會發生錯誤,而且作業不會執行。使用 SELECT 陳述式從資料庫中擷取值時,會傳回對應到相似性之類別的實體,不論該值原先儲存在資料庫時是否由不同資料類型轉換而成。
如果欄接受 NULL 值,就可以使用 ActionScript 或 JavaScript 值 null 做為參數值,以在該欄中儲存 NULL。在 SELECT 陳述式中擷取 NULL 儲存類別值時,該值一定會以 ActionScript 或 JavaScript 值 null 的形式傳回,不論欄的相似性為何。如果欄接受 NULL 值,務必先檢查從該欄擷取的值,以判斷是否為 null,之後才能嘗試將該值轉型成不可為 null 的類型 (例如 Number 或 Boolean)。
執行階段會為資料庫中的每個欄指定下列其中一個類型相似性:
-
TEXT (或 String)
-
NUMERIC
-
INTEGER (或 int)
-
REAL (或 Number)
-
Boolean
-
Date
-
XML
-
XMLLIST
-
Object
-
NONE
TEXT (或 String)
具有 TEXT 或 String 相似性的欄會使用儲存類別 NULL、TEXT 或 BLOB 儲存所有資料。如果在 TEXT 相似性的欄中插入數值資料,該資料會在儲存之前轉換為文字。
NUMERIC
具有 NUMERIC 相似性的欄會使用儲存類別 NULL、REAL 或 INTEGER 儲存所有資料。在 NUMERIC 欄中插入文字資料時,執行階段會在儲存之前嘗試將它轉換為整數或實數。如果轉換成功,就會使用 INTEGER 或 REAL 儲存類別儲存該值 (例如,'10.05' 的值會轉換為 REAL 儲存類別,再儲存起來)。如果無法執行轉換,則會發生錯誤。執行階段不會嘗試轉換為 NULL 值。從 NUMERIC 欄中擷取的值會以最符合該值的特定數值類型實體傳回。換句話說,如果值是正整數或 0,就會以 uint 實體傳回。如果值是負整數,則以 int 實體傳回。最後,如果值有浮點組件 (不是整數),則以 Number 實體傳回。
INTEGER (或 int)
使用 INTEGER 相似性的欄與具有 NUMERIC 相似性的欄行為類似,但有一個例外。如果要儲存的值是沒有浮點組件的實數 (例如 Number 實體),或該值是可轉換為沒有浮點組件之實數值的文字值,則該值會轉換為整數,並使用 INTEGER 儲存類別儲存。如果嘗試儲存有浮點組件的實數,則會發生錯誤。
REAL (或 Number)
具有 REAL 或 NUMBER 相似性的欄與具有 NUMERIC 相似性的欄行為類似,唯一的例外是它會強制以浮點表示整數值。REAL 欄中的值在從資料庫傳回時,一定會使用 Number 實體。
Boolean
具有 Boolean 相似性的欄會儲存 true 或 false 值。Boolean 欄可接受 ActionScript 或 JavaScript Boolean 實體的值。如果程式碼嘗試儲存 String 值,執行階段會將長度大於零的 String 視為 true,將空白 String 視為 false。如果程式碼嘗試儲存數值資料,任何非零值都儲存為 true,而 0 則儲存為 false。使用 SELECT 陳述式擷取 Boolean 值時,該值會以 Boolean 實體傳回。非 NULL 值會使用 INTEGER 儲存類別儲存 (0 代表 false,1 代表 true),而且在擷取資料時會轉換為 Boolean 物件。
Date
具有 Date 相似性的欄會儲存日期和時間值。Date 欄的用途是接受 ActionScript 或 JavaScript Date 實體的值。如果嘗試在 Date 欄中儲存 String 值,執行階段會嘗試將它轉換為凱撒曆日期。如果轉換失敗,就會發生錯誤。如果程式碼嘗試儲存 Number、int 或 uint 值,執行階段不會驗證資料,並假設它是有效的凱撒曆日期值。使用 SELECT 陳述式擷取的 Date 值會自動轉換為 Date 實體。Date 值會儲存為使用 REAL 儲存類別的凱撒曆日期,所以排序和比較作業會依照您預期的方式進行。
XML 或 XMLList
使用 XML 或 XMLList 相似性的欄會儲存 XML 結構。當程式碼嘗試使用 SQLStatement 參數在 XML 欄中儲存資料時,執行階段會使用 ActionScript XML() 或 XMLList() 函數嘗試轉換並驗證值。如果值無法轉換為有效的 XML,就會發生錯誤。如果嘗試使用常值 SQL 文字值儲存資料 (例如 INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)')),驗證不會剖析或驗證該值,並假設它的格式正確。如果儲存無效的值,擷取時會以空白的 XML 物件傳回。XML 和 XMLList 資料會使用 TEXT 儲存類別或 NULL 儲存類別儲存。
Object
具有 Object 相似性的欄會儲存 ActionScript 或 JavaScript 複雜物件,包括 Object 類別實體,以及 Object 子類別的實體 (如 Array 實體和自訂的類別實體)。Object 欄資料會以 AMF3 格式序列化,並使用 BLOB 儲存類別儲存。擷取值時,該值會從 AMF3 還原序列化,並以儲存之類別的實體傳回。請注意,有些 ActionScript 類別 (尤其是顯示物件) 無法還原序列化為原始資料類型的實體,所以在儲存自訂類別實體之前,您必須使用 flash.net.registerClassAlias() 方法為類別註冊別名 (在 Flex 中則是在類別宣告中加入 [RemoteObject] 中繼資料)。此外,在擷取該資料之前,必須為該類別註冊相同的別名。任何無法正確還原序列化的資料 (不論是因為類別本質上無法還原序列化,或因為類別別名遺漏或不相符) 都會以匿名物件 (Object 類別實體) 傳回,其屬性和值則對應到原先儲存的實體。
NONE
具有 NONE 相似性的欄不偏好任一種儲存類別。它在插入資料之前不會嘗試轉換資料。
決定相似性
欄的類型相似性會由 CREATE TABLE 陳述式中該欄的宣告類型決定。決定類型時所套用的規則 (不區分大小寫) 如下:
-
如果欄的資料類型包含 "CHAR"、"CLOB"、"STRI" 或 "TEXT" 中任一個字串,則該欄具有 TEXT/String 相似性。請注意,類型 VARCHAR 包含字串 "CHAR",所以會指定為 TEXT 相似性。
-
如果欄的資料類型包含 "BLOB" 字串,或如果未指定資料類型,則該欄具有 NONE 相似性。
-
如果欄的資料類型包含 "XMLL" 字串,則該欄具有 XMLList 相似性。
-
如果資料類型是 "XML" 字串,則該欄具有 XML 相似性。
-
如果資料類型是 "OBJE" 字串,則該欄具有 Object 相似性。
-
如果資料類型是 "BOOL" 字串,則該欄具有 Boolean 相似性。
-
如果資料類型是 "DATE" 字串,則該欄具有 Date 相似性。
-
如果資料類型包含 "INT" (包括 "UINT") 字串,則該欄會指定為 INTEGER/int 相似性。
-
如果欄的資料類型包含 "REAL"、"NUMB"、"FLOA" 或 "DOUB" 中任一個字串,則該欄具有 REAL/Number 相似性。
-
否則,相似性會是 NUMERIC。
-
如果資料表是使用 CREATE TABLE t AS SELECT... 陳述式所建立的,則所有欄都未指定資料類型,並指定為 NONE 相似性。