字符串类型¶
神通数据库提供的字符串类型如下表所示:
| 类型名 | 描述 | 有效范围 |
|---|---|---|
| character(n), char(n) | 固定长度n的字符数据,若不足,以空白填充 | 最大长度为n个字符,而n不能大于8000 |
| character varying(n), varchar(n),varchar2(n) nvarchar2(n) | 最大长度n的可变长字符数据 | 最大长度为n个字符,而n不能大于8000 |
| text | 可变长字符数据 | 最大长度为16777215个字节 |
SQL 定义了三种基本的字符类型:character(n) 、character varying(n)、varchar2(n)这里的 n 是一个正整数。
注解
以上这些字符串类型在 n 后也可以写byte|char,例如:character(n [byte|char]),但是神通暂时没有真正的实现以字节来存储,都是以字符为单位来存储的,只是语法上暂时支持。
注解
神通暂时没有真正的实现数据类型varchar2和nvarchar2(n),只将其在语法解析时映射成varchar(n)类型。
三种类型都可以存储最多 n 个字符的字符串;但是如果它们作为列类型,长度将受限于页面长度,即不能超过8192个字节。 存储更长的字符串到这些类型是不允许的,除非超出长度的字符都是空白, 这种情况下该字符串将被截断为允许的最大长度n。
如果要存储的字符串比声明的长度短,类型为 character 的数值将会用空白填满;而类型为 character varying 的数值只是存储该字符串的实际内容,不会用空白填充。
char(n) 和 varchar(n)分别是 character(n) 和 character varying(n) 的别名,没有长度声明的character 和 character varying,其接受的字符串长度由系统配置参数来决定。
text 类型是更通用的字符串类型,它可以存储其有效范围内任何长度的字串。 和 character varying 不同的是,text 不需要明确地声明长度的上限。
神通数据库中,字符串类型常量由单引号(')限定的任意字符序列来表示,如 'This is a string'。 编码为零的字符不能出现在字符串常量中。通过换行符分隔的字符串常量会被连接在一起,并当做一个常量处理。 比如:
SELECT 'foo
bar';
等效于
SELECT 'foobar';
下面是条非法的语句
SELECT 'foo' 'bar';
神通数据库允许在字符串里嵌入单引号,但是需要使用两个连续的单引号(如,'Dianne''s horse'), 或者在单引号的前面加反斜杠(如, 'Dianne\'s horse')来表示。 神通数据库也允许字符串常量中包含反斜扛,但需要使用两个连续的反斜扛(\\)来表示。 神通数据库中字符串类型还可以使用 C 风格的如下转义字符:
- \b 退格
- \f 进纸
- \n 换行
- \r 回车
- \t 制表符
- \xxx 八进制数
下表为神通数据库支持的特殊的字符串类型(与Oracle不兼容):
| 类型名 | 描述 | 有效范围 |
|---|---|---|
| "CHAR" | 固定长度为1的字符数据,超出长度1发生截断 | 固定长度为 1 个字符 |
| NAME | 最大长度127的字符数据 | 最大长度为 127 个字符 |
"CHAR"类型最多可存储1个字符的字符串,NAME 类型最多可存储127个字符的字符串. 存储更长的字符串到这两种类型是被允许的,这种情况下该字符串会在"CHAR"类型下被截断为长度为1,在 NAME 类型下被截断为长度为127.
示例1: 使用字符串类型
-- 清理环境
DROP TABLE tab1 CASCADE;
CREATE TABLE tab1 (a CHARACTER(4));
-- 插入字符串类型数据
INSERT INTO tab1 VALUES ('ok');
-- 查询字符串类型数据
SELECT a, CHAR_LENGTH(a) FROM tab1;
A(char) |CHAR_LENGTH(int) |
-----------------------------------
ok |4 |
总数目:1
-- 删除视图、表
DROP TABLE tab1;
示例2: 插入超长字符串类型
-- 清理环境
DROP TABLE tab2 CASCADE;
CREATE TABLE tab2 (b VARCHAR(5));
-- 插入字符串类型数据(未超长)
INSERT INTO tab2 VALUES ('ok');
-- 插入字符串类型数据(超长)
-- 超长部分是空格,插入成功
INSERT INTO tab2 VALUES ('good ');
-- 插入字符串类型数据(超长)
-- 插入失败
INSERT INTO tab2 VALUES ('too long');
ERROR, 字符串溢出, varchar(5)类型的值太大(实际值:8,最大值:5)
SELECT b, CHAR_LENGTH(b) FROM tab2 ORDER BY b;
B(varchar) |CHAR_LENGTH(int) |
--------------------------------------
good |5 |
--------------------------------------
ok |2 |
总数目:2
-- 删除视图、表
DROP TABLE tab2;