列的
关联
是存储在该列中的数据的建议类型。一个值存储在列中(通过 INSERT 或 UPDATE 语句)时,运行时尝试将该值从其数据类型转换为指定的关联。例如,如果将 Date 值(ActionScript 或 JavaScript Date 实例)插入到一个其关联为 TEXT 的列中,则 Date 值在存储于数据库中之前将转换为 String 表示形式(等效于调用对象的 toString() 方法)。如果该值无法转换为指定的关联,则出现错误,且不执行操作。使用 SELECT 语句从数据库中检索值时,它作为对应于关联的类的实例返回,而不管它在被存储时是否已从不同数据类型转换。
如果一个列接受 NULL 值,则 ActionScript 或 JavaScript 值 null 可用作参数值在该列中存储 NULL。当 NULL 存储类值在 SELECT 语句中检索时,它始终作为 ActionScript 或 JavaScript 值 null 返回,而不管列的关联如何。如果一个列接受 NULL 值,则在尝试将值转换成不可为 Null 的类型(如 Number 或 Boolean)之前,始终检查从该列检索的值以确定它们是否为 null。
为数据库中的每个列分配以下类型关联之一:
-
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 实例的值。如果代码尝试存储字符串值,则将长度大于零的字符串视为 true,将空字符串视为 false。如果代码尝试存储数字数据,则任何非零值作为 true 存储,而 0 作为 false 存储。使用 SELECT 语句检索 Boolean 值时,它作为 Boolean 实例返回。非 NULL 值是使用 INTEGER 存储类存储的(0 表示 false,1 表示 true),并在检索数据时转换为 Boolean 对象。
Date
具有 Date 关联的列存储日期和时间值。Date 列用于接受作为 ActionScript 或 JavaScript Date 实例的值。如果尝试在 Date 列中存储 String 值,则运行时会尝试将该 String 值转换为罗马儒略历日期。如果转换失败,则出现错误。如果代码尝试存储 Number、int 或 uint 值,则不会尝试验证数据,而假定它是有效的罗马儒略历日期值。使用 SELECT 语句检索的 Date 值将自动转换为 Date 实例。使用 REAL 存储类将 Date 值存储为罗马儒略历日期值,因此排序和比较操作可以如预期的那样进行。
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。