# 第六章 数据类型(五) # 数据类型的整数代码 在查询元数据和其他上下文中,为列定义的数据类型可以作为整数代码返回。 `CType`(客户端数据类型)整数代码列在 `%SQL.StatementColumn` `clientType` 属性中。 ODBC 和 JDBC 使用 xDBC 数据类型代码 (SQLType)。 ODBC 数据类型代码由 `%SQL.Statement.%Metadata.columns.GetAt()` 方法返回,如上例所示。 SQL Shell 元数据还返回 ODBC 数据类型代码。 JDBC 代码与 ODBC 代码相同,除了时间和日期数据类型的表示。下面列出了这些 ODBC 和 JDBC 值: ODBC| JDBC| Data Type ---|---|--- -11| -11| GUID -7 |-7| BIT -6| -6| TINYINT -5| -5| BIGINT -4| -4| LONGVARBINARY -3| -3| VARBINARY -2| -2| BINARY -1| -1 |LONGVARCHAR 0| 0| Unknown type 1| 1| CHAR 2| 2| NUMERIC 3| 3| DECIMAL 4| 4| INTEGER 5| 5| SMALLINT 6| 6| FLOAT 7| 7| REAL 8| 8| DOUBLE 9| 91| DATE 10| 92| TIME 11| 93| TIMESTAMP 12 |12| VARCHAR IRIS 还支持使用多字节字符集的 ODBC 应用程序的 Unicode SQL 类型,例如中文、希伯来语、日语或韩语语言环境。 ODBC| Data Type ---|--- -10| `WLONGVARCHAR` -9| `WVARCHAR` # 创建用户定义的 DDL 数据类型 可以通过覆盖系统数据类型参数值的数据类型映射或定义新的用户数据类型来修改数据类型集。可以修改系统数据类型以覆盖 默认映射。可以创建用户定义的数据类型以提供 不提供的其他数据类型映射。 要查看和修改或添加到当前用户数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、用户 DDL 映射。要添加用户数据类型,请选择创建新的用户定义的 DDL 映射。在显示的框中,输入名称,例如 `VARCHAR(100)` 和数据类型,例如 `MyString100(MAXLEN=100)`。 结果将是用户定义的 DDL 数据类型列表中的一个条目。 可以将用户定义的数据类型创建为数据类型类。例如,可能希望创建一个最多占用 `10` 个字符的字符串数据类型,然后截断其余的输入数据。将创建此数据类型 `Sample.TruncStr`,如下所示: ```sql Class Sample.TruncStr Extends %Library.String { Parameter MAXLEN=10; Parameter TRUNCATE=1; } ``` 要在表定义中使用此数据类型,只需指定数据类型类名称: ```sql CREATE TABLE Sample.ShortNames (Name Sample.TruncStr) ``` 如前面的示例所示,有几个有用的例程可用于输入用户定义的 DDL 数据类型: - `maxval^%apiSQL()` — 给定精度和比例,返回每个 IRIS 数字数据类型的最大有效值 (`MAXVAL`)。语法是: ```sql maxval^%apiSQL(precision,scale) ``` - `minval^%apiSQL()` — 给定精度和比例,返回每个 IRIS 数字数据类型的最小有效值 (`MINVAL`)。语法是: ```sql minval^%apiSQL(precision,scale) ``` 如果需要将 DDL 数据类型映射到集合类型为 `Stream` 的 IRIS 属性,请为字符流数据指定 `%Stream.GlobalCharacter`,为二进制流数据指定 `%Stream.GlobalBinary`。 # 如果找不到DDL映射,则传递 如果 DDL 遇到不在 `SystemDataTypes` 表的 DDL 数据类型列中的数据类型,它接下来会检查 UserDataTypes 表。如果任一表中的数据类型都没有出现映射,则不会发生数据类型的转换,并且数据类型会直接传递给 DDL 中指定的类定义。 例如,以下字段定义可能出现在 DDL 语句中: ```sql CREATE TABLE TestTable ( Field1 %String, Field2 %String(MAXLEN=45) ) ``` 鉴于上述定义,如果 DDL 在 `SystemDataTypes` 或 `UserDataTypes` 中找不到 `%String` 或 `%String(MAXLEN=%1)` 或 `%String(MAXLEN=45)` 的映射,则传递 `%String` 和 `%String(MAXLEN=45)` 类型直接到适当的类定义。 # 转换数据类型 要将数据从一种数据类型转换为另一种数据类型,请使用 CAST 或 `CONVERT` 函数。 `CAST` 支持转换为多种字符串和数字数据类型,以及 `DATE`、`TIME` 以及 `TIMESTAMP` 和 `POSIXTIME` 时间戳数据类型。 `CONVERT` 有两种语法形式。两种形式都支持与 `DATE`、`TIME` 以及 `TIMESTAMP` 和 `POSIXTIME` 时间戳数据类型之间的转换,以及其他数据类型之间的转换。 ## VARCHAR 的 CAST 和 CONVERT 处理 `VARCHAR` 数据类型(没有指定大小)映射到 `1` 个字符的 `MAXLEN`,如上表所示。但是,当 `CAST` 或 `CONVERT` 将值转换为 `VARCHAR` 时,默认大小映射为 `30` 个字符。提供此 `30` 个字符的默认大小是为了与非 IRIS 软件要求兼容。