
# 字符类型
DataArts Fabric SQL支持的字符类型请参见[表1]。字符串操作符和相关的内置函数请参见[字符处理函数和操作符](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0201.html)。
 表1字符类型 
| 名称                                                                                                                                                                                                                          | 描述            | 长度                                 | 存储空间                         |
|:---|:---|:---|:---|
| CHAR(n) CHARACTER(n) NCHAR(n) | 定长字符串，不足填充空格。 | n是指字节长度，如不带精度n，默认精度为1。n小于10485761。 | 最大为10MB。                     |
| VARCHAR(n) CHARACTER VARYING(n)                                                                                              | 变长字符串。        | n是指字节长度，n小于10485761。               | 最大为10MB。                     |
| TEXT                                                                                                                                                                                                                        | 变长字符串。        | -                                  | 最大为1GB-8203B（即1073733621B） 。 |
   
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/note_3.0-zh-cn.png)
- 除了每列的大小限制以外，每个元组的总大小也不可超过1GB-8023B（即1073733621B）。
- 对于字符串数据，建议使用变长字符串数据类型，并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数，避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串，否则，不建议使用CHAR(n)、NCHAR(n)、CHARACTER(n)等定长字符类型。在DataArts Fabric SQL中，定长字符类型的运算会存在额外的存储和内存开销。
 
在DataArts Fabric SQL里另外还有两种定长字符类型。在[表2]里显示。
其中，name类型只用在内部系统表中，作为存储标识符，该类型长度当前定为64字节（63可用字符加结束符）。不建议普通用户使用这种数据类型。name类型与其他数据类型进行对齐时（例如case when的多个分支中，其中一个分支返回name类型，其他类型返回text类型），可能会出现向name类型对齐，字符截断。如果不希望出现字符按照64位截断的情况，则需要将name类型强制类型转化为text类型。
类型"char"只用了一个字节的存储空间。它在系统内部主要用于系统表，主要作为简单化的枚举类型使用。
 表2特殊字符类型 
| 名称     | 描述          | 存储空间  |
|:---|:---|:---|
| name   | 用于对象名的内部类型。 | 64字节。 |
| "char" | 单字节内部类型。    | 1字节。  |
   
#### 长度
如果把一个字段定义为char(n)或者varchar(n)， 代表该字段最大可容纳n个长度的数据。无论哪种类型，可设置的最大长度都不得超过10485760（即10MB）。
当数据长度超过指定的长度n时，会抛出错误"value too long"。也可通过指定数据类型，使超过长度的数据自动截断。
示例：
1. 创建表t1，指定其字段的字符类型。
   ```
   CREATE TABLE t1(a char(5), b varchar(5)) STORE AS orc;
   ```
   
2. 向表t1插入数据时超过指定的字节长度报错。
   ```
   INSERT INTO t1 VALUES('bookstore','123');
   ERROR:  value too long for type character(5)
   ```
   
3. 向表t1插入数据并明确超过指定字节长度后自动截断。
   ```
   INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5));
   INSERT 0 1
   SELECT a,b FROM t1;
      a   |   b
   -------+-------
    books | 12345
   (1 row)
   ```
   
 
#### 定长与变长
所有字符类型根据长度是否固定可以分为定长字符串与变长字符串两大类。
- 对于定长字符串，长度必须确定，如果不指定长度，则默认长度1；如果数据长度不足，会在尾部自动填充空格，用以存储和显示；但这部分填充的数据是无意义的，实际使用中会被忽略，如比较、排序或类型转换。
- 对于变长字符串，如果指定长度，则为最大可存储数据长度；如果不指定长度，则认为该字段支持任意长度。
示例：
1. 创建表t2，指定其字段的字符类型。
   ```
   CREATE TABLE t2 (a char(5),b varchar(5)) STORE AS orc;
   ```
   
2. 向表t2插入数据并查询字段a的字节长度。因建表时指定a的字符类型为char(5)且是定长字符串，长度不足，填充空格，所以查询的字节长度为5。
   ```
   INSERT INTO t2 VALUES('abc','abc');
   INSERT 0 1
   SELECT a,lengthb(a),b FROM t2;
      a   | lengthb |  b
   -------+---------+-----
    abc   |       5 | abc
   (1 row)
   ```
   
3. 用函数转换后查询字段a的实际字节长度为3。
   ```
   SELECT a = b from t2;
    ?column?
   ----------
    t
   (1 row)
   SELECT cast(a as text) as val,lengthb(val) FROM t2;
    val | lengthb
   -----+---------
    abc |       3
   (1 row)
   ```
   
 
#### 空串与NULL
TD与MySQL兼容模式下，区分空串与null。
- TD兼容模式下示例：
  ```
  SELECT  '' is null , null is null;
   isnull |  isnull
  --------+----------
   f      | t
  (1 rows)
  ```
  

- MySQL兼容模式下示例：
  ```
  SELECT  '' is null , null is null;
   isnull |  isnull
  --------+----------
   f      | t
  (1 rows)
  ```
  
 
