
# 原生数据类型
AI DataLake支持原生数据类型，请参见[表1]。
 表1原生数据类型 
| **数据类型**                     | **描述**                                                                       | **存储空间** | **范围**                                                                              | **OBS表支持情况** | **管理表支持情况** |
|:---|:---|:---|:---|:---|:---|
| **INT**                      | 有符号整数                                                                        | 4字节      | -2147483648～2147483647                                                              | 是            | 是           |
| **STRING**                   | 字符串                                                                          | -        | -                                                                                   | 是            | 是           |
| **FLOAT**                    | 单精度浮点型                                                                       | 4字节      | -                                                                                   | 是            | 是           |
| **DOUBLE**                   | 双精度浮点型                                                                       | 8字节      | -                                                                                   | 是            | 是           |
| **DECIMAL(precision,scale)** | 10进制精确数字类型。固定有效位数和小数位数的数据类型，例如：3.5。precision：表示最多可以表示多少位的数字。scale：表示小数部分的位数。 | -        | 1\<=precision\<=38\<br\>0\<=scale\<=38\<br\>若不指定precision和scale，则默认为decimal(38,38)。 | 是            | 是           |
| **BOOLEAN**                  | 布尔类型                                                                         | 1字节      | TRUE/FALSE                                                                          | 是            | 是           |
| **SMALLINT/SHORT**           | 有符号整数                                                                        | 2字节      | -32768\~32767                                                                       | 是            | 是           |
| **TINYINT**                  | 有符号整数                                                                        | 1字节      | -128\~127                                                                           | 是            | 否           |
| **BIGINT/LONG**              | 有符号整数                                                                        | 8字节      | -9223372036854775808～9223372036854775807                                            | 是            | 是           |
| **TIMESTAMP**                | 时间戳，表示日期和时间，格式为原始数据。例如：1621434131222                                         | -        | -                                                                                   | 是            | 是           |
| **TIMESTAMP_NTZ(p)**         | 无时区时间戳，p为秒小数精度（0-6），不带时区信息                                                   | -        | -                                                                                   | 是            | 是           |
| **TIMESTAMP_LTZ(p)**         | 有时区时间戳，p为秒小数精度（0-6），带时区信息                                                    | -        | -                                                                                   | 是            | 是           |
| **CHAR**                     | 固定长度字符串                                                                      | -        | -                                                                                   | 是            | 是           |
| **VARCHAR**                  | 可变长度字符串                                                                      | -        | -                                                                                   | 是            | 是           |
| **DATE**                     | 日期类型，描述了特定的年月日，以yyyy-mm-dd格式表示，例如：2014-05-29                                 | -        | DATE类型不包含时间，所表示日期的范围为0000-01-01\~ 9999-12-31。                                       | 是            | 是           |
| **VARIANT**                  | 适用于半结构化数据处理，只支持iceberg表。                                                     | -        | -                                                                                   | 是            | 是           |
   
![](https://support.huaweicloud.com/sqlref-spark-aidatalake/public_sys-resources/note_3.0-zh-cn.png)
- VARCHAR和CHAR在实际存储是STRING型，因此超出长度的字符串不会被截断。
- FLOAT类型在实际存储是DOUBLE型。
- Spark Native已支持VARIANT类型。
- 仅v3表支持VARIANT数据类型。
 
#### INT
有符号整数，存储空间为4字节，-2147483648～2147483647，在NULL情况下，默认值为0。
#### STRING
字符串类型。
#### FLOAT
单精度浮点型，存储空间为4字节，在NULL情况下，计算时默认值为0。
由于浮点类型的数据在计算机中的存储方式的限制，在比较两个浮点类型的数据是否相等时，因存在精度问题，不能直接采用"a==b"的方式进行比较，建议使用"(a-b)的绝对值\<=EPSILON"这种方式进行比较，EPSILON为允许的误差范围，一般为1.19209290E-07F。若两个浮点数的差值的绝对值在这个范围内就认为相等。
#### DOUBLE
双精度浮点型，存储空间为8字节，在NULL情况下，采用计算值默认值为0。
由于浮点类型的数据在计算机中的存储方式的限制，在比较两个浮点类型的数据是否相等时，因存在精度问题，不能直接采用"a==b"的方式进行比较，建议使用"(a-b)的绝对值\<=EPSILON"这种方式进行比较，EPSILON为允许的误差范围，一般为2.2204460492503131E-16。若两个浮点数的差值的绝对值在这个范围内就认为相等。
#### DECIMAL
Decimal(p,s)表示数值中共有p位数，其中整数p-s位，小数s位。p表示可储存的最大十进制数的位数总数，小数点左右两侧都包括在内。有效位数p必须是1至最大有效位数38之间的值。s表示小数点右侧所能储存的最大十进制数的位数。小数位数必须是从0到p的值。只有在指定了有效位数时，才能指定小数位数。因此，0 ≤ s ≤ p。例如：decimal(10,6)，表示数值中共有10位数，其中整数占4位，小数占6位。
#### BOOLEAN
布尔类型，包括TRUE与FALSE。
#### SMALLINT/SHORT
有符号整数，存储空间为2字节，范围为-32768～32767。当为NULL情况下，采用计算值默认为0。
#### TINYINT
有符号整数，存储空间为1字节，范围为-128～127。当为NULL情况下，采用计算值默认为0。
#### BIGINT/LONG
有符号整数，存储空间为8字节，范围为-9223372036854775808～9223372036854775807，不支持科学计数法。当为NULL情况下，采用计算值默认为0。
#### TIMESTAMP
支持传统的UNIX TIMESTAMP，提供达到微秒级别精度的选择。TIMESTAMP是以指定时间和UNIX epoch（UNIX epoch时间为1970年1月1日00:00:00）之间的秒数差定义的。可以向TIMESTAMP隐式转换的数据类型有STRING（必须具有"yyyy-MM-dd HH:mm:ss\[.ffffff\]"格式。小数点后精度可选）。
#### CHAR
CHAR的长度是固定的，使用指定长度的固定长度表示字符串。实际存储为STRING类型。
#### VARCHAR
VARCHAR生成时会带有一个长度指定数，用来定义字符串中的最大字符数。如果一个向VARCHAR转换的STRING型中的字符个数超过了长度指定数，那么这个STRING会被自动缩短。和STRING类型一样，VARCHAR末尾的空格数是有意义的，会影响比较结果。实际存储为STRING类型。
#### DATE
DATE类型只能和DATE、TIMESTAMP和STRING进行显式转换（cast），具体如[表2]所示。
 表2cast函数转换 
| **显式转换**                | **转换结果**                                                     |
|:---|:---|
| cast(date as date)      | 相同DATE值。                                                     |
| cast(timestamp as date) | 根据本地时区从TIMESTAMP得出年/月/日，将其作为DATE值返回。                         |
| cast(string as date)    | 如果字符串的形式是"yyyy-MM-dd"，将对应年/月/日作为DATE值返回。如果字符串不具有这种形式，返回NULL。 |
| cast(date as timestamp) | 根据本地时区生成并返回对应DATE的年/月/日零点的TIMESTAMP值。                        |
| cast(date as string)    | 根据DATE的年/月/日值生成并返回"yyyy-MM-dd"格式的字符串。                        |
   
#### VARIANT
VARIANT是一种通用数据类型，适用于半结构化数据的存储与处理。VARIANT类型可以灵活容纳JSON对象、数组、嵌套结构等多种半结构化数据格式，无需提前定义固定的表结构。该类型仅支持在Iceberg表中使用。
