#字符型
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