#字符型

YashanDB中的字符型包括英文字母、中文汉字、数字字符和特殊字符等,多用于存储文本数据。此外,该类型还能通过隐式数据转换,灵活地参与到数值型、日期时间型的运算场景之中。

字符型具体可分为CHAR、VARCHAR、NCHAR和NVARCHAR四种数据类型。

# 存储属性

类型 字节长度
CHAR 1~8000
VARCHAR 1~32000
NCHAR 1~8000
NVARCHAR 1~32000

Note

在HEAP表中,长度超过8000字节的VARCHAR/NVARCHAR列会转换成LOB类型进行存储。创建表时,若指定某个列的数据类型大小超过8000字节,该列就会转换成LOB类型进行存储。

例如在UTF8字符集(一个字符最大可以占用4字节)下,定义了VARCHAR(2001 CHAR)列,则可能会存储8004字节的数据,此时该列会转换成LOB类型进行存储。

# CHAR和VARCHAR

CHAR数据类型用于指定固定长度的字符串,VARCHAR数据类型用于指定可变长度的字符串。

CHARACTER可作为CHAR别名使用,含义与CHAR含义相同。VARCHAR2、CHARACTER VARYING可作为VARCHAR别名使用,含义与VARCHAR含义相同。

定义格式:

类型 语法格式 规则
CHAR CHAR(Size[byte]) 定长字符串,Size的范围是[1,8000],不指定Size时,Size默认为1;当插入的字符串小于Size时会发生空格补位行为;当插入的字符串大于Size时会插入失败,报错。
VARCHAR VARCHAR(Size[byte]) 变长字符串,Size的范围是[1,32000],当插入的字符串小于Size时不会发生空格补位行为;当插入的字符串大于Size时会插入失败,报错。
CHAR CHAR(Size(char)) 定长字符串,Size的范围是[1,8000],不指定Size时,Size默认为1;当插入的字符串小于Size时会发生空格补位行为,补充的空格数为缺少的字符数;当插入的字符串大于Size时会插入失败,报错。
VARCHAR VARCHAR(Size(char)) 变长字符串,Size的范围是[1,32000],当插入的字符串小于Size时不会发生空格补位行为;当插入的字符串大于Size时会插入失败,报错。

Size:宽度,表示最大长度,根据可选长度单位可分为字节长度和字符长度,行存表支持两种长度单位,列存表仅支持字节长度单位。

Size后可选单位为byte和char,分别为按照字节和按照字符,其中byte和char与Size之间可有空格也可以没有。若不指定单位,默认为byte。长度单位与NCHAR及NVARCHAR类型有所不同,请注意区分。

示例(HEAP表)

-- 定义不同单位的CHAR类型数据
CREATE TABLE chartable (c1 CHAR(30),c2 CHAR(30 byte),c3 CHAR(30 CHAR));
INSERT INTO chartable VALUES('a','abc','abcccc');
COMMIT;
SELECT c1,c2,c3 FROM chartable;

C1                                C2                                C3                                                               
--------------------------------- --------------------------------- ---------------------------------------------------------------- 
a                                 abc                               abcccc                    

-- 定义不同单位的VARCHAR类型数据
CREATE TABLE varchartable (v1 VARCHAR(30),v2 VARCHAR(30 byte),v3 VARCHAR(30 CHAR));
INSERT INTO varchartable VALUES('a','abc','abcccc');
COMMIT;
SELECT v1,v2,v3 FROM varchartable;

V1                                V2                                V3                                                               
--------------------------------- --------------------------------- ---------------------------------------------------------------- 
a                                 abc                               abcccc              

-- 定义字符型数据时,如超出长度范围返回错误
CREATE TABLE overlimit (c1 CHAR(9000 byte),c2 CHAR(9000 CHAR));

[1:32]YAS-04204 number of column size must be between 1 and 8000

# NCHAR和NVARCHAR

NCHAR用于指定支持UNICODE的固定长度字符串,NVARCHAR用于指定支持UNICODE的可变长度字符串,这两种字符型仅支持在配置UNICODE字符集的数据库中使用,可以对多语言数据进行存储。

NVARCHAR2可作为NVARCHAR别名使用,含义与NVARCHAR含义相同。

NCHAR和NVARCHAR类型仅适用于HEAP表。

定义格式:

类型 语法格式 规则
NCHAR NCHAR(Size) 定长字符串,Size的范围是[1,4000],不指定Size时,Size默认为1;当插入的字符串小于Size时会发生空格补位行为;当插入的字符串大于Size时会插入失败,报错。
NVARCHAR NVARCHAR(Size) 变长字符串,Size的范围是[1,16000],当插入的字符串小于Size时不会发生空格补位行为;当插入的字符串大于Size时会插入失败,报错。

Size用于表示字符个数,必须为一个整数数值,数据的存储长度为Size的2倍,单位为字符长度。

NCHAR类型存储长度上限为8000字节,NVARCHAR类型存储长度上限为32000字节,超过如上大小限制的数据不会进行存储。

示例(HEAP表)

-- 定义不同单位的NCHAR类型数据
CREATE TABLE nchartable (c1 NCHAR(30));
INSERT INTO nchartable VALUES('a');
COMMIT;
SELECT c1 FROM nchartable;

C1                                                               
---------------------------------------------------------------- 
a                                                               
               

-- 定义不同单位的NVARCHAR类型数据
CREATE TABLE nvarchartable (v1 NVARCHAR(30));
INSERT INTO nvarchartable VALUES('a');
COMMIT;
SELECT v1 FROM nvarchartable;

V1                                                               
---------------------------------------------------------------- 
a             

-- 定义字符型数据时,如超出长度范围返回错误
CREATE TABLE overlimit_nchar (c1 NCHAR(9000));

[1:40]YAS-04204 number of column size must be between 1 and 4000

CREATE TABLE overlimit_nvarchar (c1 NVARCHAR(20000));

[1:46]YAS-04204 number of column size must be between 1 and 16000

# 字符型排序

当对字符型数据执行排序操作时:

  • 默认基于字符的ASCII值排序,例如'a'小于'b','1'小于'2'。

  • 通过NLSSORT函数,可以对UTF8编码的数据进行拼音排序。

# 字符型比较

当两个字符型数据执行比较运算时:

  • 执行大小写敏感的字符串比较。
  • 若比较符两边均为CHAR或均为NCHAR类型,YashanDB会先将较短的CHAR或NCHAR空格补位至较长CHAR的长度,再进行值比较。
  • 若比较符号的任意一边为VARCHAR或NVARCHAR类型,则不进行空格补位直接比较。

示例

-- Example 1: 比较符号两侧都是CHAR类型时,YashanDB会先将长度补齐再比较
SELECT 1 FROM DUAL
WHERE CAST('A' AS CHAR(50)) = CAST('A' AS CHAR(30));
           1
------------
           1
   
-- Example 2: 比较符号任何一侧为VARCHAR类型时,YashanDB不会补齐长度直接比较
SELECT 1 FROM DUAL
WHERE CAST('A' AS CHAR(50)) > CAST('A' AS VARCHAR(50));
           1
------------
           1
   
SELECT 1 FROM DUAL
WHERE CAST('A' AS VARCHAR(30)) < CAST('A' AS CHAR(50));
           1
------------
           1
               
-- Example 3: 不指定CHAR的Size大小时,Size默认为1
SELECT CAST('A' AS CHAR) result FROM DUAL;
RESULT
------ 
A

SELECT CAST('ABC' AS CHAR) result FROM DUAL;
RESULT
------ 
A

SELECT CAST('ABC' AS CHAR(1)) result FROM DUAL;
RESULT
------ 
A

SELECT CAST('ABC' AS CHAR(2)) result FROM DUAL;
RESULT
------ 
AB