上一期介绍了MogDB货币类型和布尔类型,在测试布尔类型过程中发现官方文档有欠缺的地方,请负责官方文档的同事进行更正了。接下我接续介绍MogDB的数据类型。 这篇文档前几天写了一半了,马上要写完了,结果找不到了, 又重写了。人生就是这样,多灾多难,源自于人的愚笨。一次又一次的选择性失误。也只能往前走了。
字符类型
字符类型是数据库最常用的数据类型之一, MogDB 相对于Postgre SQL做了许多优化,主要是针对Oracle和MySQL 做了数据类型兼容性适配了。MogDB 字符类型可以分为两种,分为普通字符类型和特殊数据类型两种。又可以分为有限制的变长,和定长,无限变长、三种。如上表。text和club 类型中1G-1,需要1个字节存放控制头信息和元组控制头信息等。
| 名称 | 描述 | 存储空间 |
|---|---|---|
| CHAR(n) CHARACTER(n) NCHAR(n) | 定长字符串,不足补空格。n是指字节长度,如不带精度n,默认精度为1。 | 最大为10MB。 |
| VARCHAR(n) CHARACTER VARYING(n) | 变长字符串。PG兼容模式下,n是字符长度。其他兼容模式下,n是指字节长度。 | 最大为10MB。 |
| VARCHAR2(n) | 变长字符串。是VARCHAR(n)类型的别名。n是指字节长度。 | 最大为10MB。 |
| NVARCHAR2(n) | 变长字符串。n是指字符长度。 | 最大为10MB。 |
| NVARCHAR(n) | 变长字符串。是NVARCHAR2(n)类型的别名。n是指字符长度。 | 最大为10MB。 |
| TEXT | 变长字符串。 | 最大为1GB-1,但还需要考虑到列描述头信息的大小, 以及列所在元组的大小限制(也小于1GB-1),因此TEXT类型最大大小可能小于1GB-1。 |
| CLOB | 文本大对象。是TEXT类型的别名。 | 最大为1GB-1,但还需要考虑到列描述头信息的大小, 以及列所在元组的大小限制(也小于1GB-1),因此CLOB类型最大大小可能小于1GB-1。 |
特殊字符类型
| 名称 | 描述 | 存储空间 |
|---|---|---|
| name | 用于对象名的内部类型。 | 64字节。 |
| “char” | 单字节内部类型。 | 1字节。 |
name 类型用于存储标识符,主要用于系统表,普通用户不建议使用,
“char” 类型,与普通的char 类型不一样,“char” 类型是postgre sql系统类型。它只用了一个字节的存储空间。它在系统内部用于系统目录当做简化的枚举类型用。
示例:
CREATE TABLE varchar2_type_t1
(
CT_COL1 VARCHAR2(5)
);
insert into varchar2_type_t1 values ('MogDB');
MogDB=# select * from varchar2_type_t1;
ct_col1
---------
MogDB
#如果是变长字符串,会报错。
insert into varchar2_type_t1 values ('Postgresql');
select * from varchar2_type_t1;
ERROR: value too long for type character varying(5)
#也可以自动截断
INSERT INTO varchar2_type_t1 VALUES (‘Postgresql’::varchar(5));
MogDB=# select ct_col1,char_length(ct_col1) from varchar2_type_t1;
ct_col1 | char_length
---------+-------------
MogDB | 5
Postg | 5
(2 rows)
::用法,等同于cast 函数,属于一种强质类型转换方式。
expression::type
比cast 写法要简捷。
CAST ( expression AS target_type );
如果表达式不能转换为目标类型。会报错。
二进制类型
| 名称 | 描述 | 存储空间 |
|---|---|---|
| BLOB | 二进制大对象 说明: 列存不支持BLOB类型 | 最大为1GB-8203字节(即1073733621字节)。 |
| RAW | 变长的十六进制类型 说明: 列存不支持RAW类型 | 4字节加上实际的十六进制字符串。最大为1GB-8203字节(即1073733621字节)。 |
| BYTEA | 变长的二进制字符串 | 4字节加上实际的二进制字符串。最大为1GB-8203字节(即1073733621字节)。 |
| BYTEAWITHOUTORDERWITHEQUALCOL | 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为确定性加密,则该列的实际类型为BYTEAWITHOUTORDERWITHEQUALCO),元命令打印加密表将显示原始数据类型。 | 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 |
| BYTEAWITHOUTORDERCOL | 变长的二进制字符串(密态特性新增的类型,如果加密列的加密类型指定为随机加密,则该列的实际类型为BYTEAWITHOUTORDERCOL),元命令打印加密表将显示原始数据类型。 | 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 |
| _BYTEAWITHOUTORDERWITHEQUALCOL | 变长的二进制字符串,密态特性新增的类型 | 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 |
| _BYTEAWITHOUTORDERCOL | 变长的二进制字符串,密态特性新增的类型 | 4字节加上实际的二进制字符串。最大为1GB减去53字节(即1073741771字节)。 |
BYTEA 是Postgre SQL 原生的二进制数据类型,除了BYTEA 之外,MogDB 还做了许多扩展和Oracle兼容类型以及对二进制密态新增数据类型,不支持使用BYTEAWITHOUTORDERWITHEQUALCOL、BYTEAWITHOUTORDERCOL、_BYTEAWITHOUTORDERWITHEQUALCOL和_BYTEAWITHOUTORDERCOL类型进行建表,操作这几种类型有对应的密态操作函数。可以参考以下内容https://docs.mogdb.io/zh/mogdb/v5.0/encrypted-equality-functions。
bytea 还有一个逃逸(escpe)字符的概念,是PostgreSQL 传统格式。
| 十进制字节值 | 描述 | 逃逸输入表示 | 例子 | 输出表示 |
|---|---|---|---|---|
| 0 | 0字节 | E'\\000' |
SELECT E'\\000'::bytea; |
\000 |
| 39 | 单引号 | ''''或E'\\047' |
SELECT E'\''::bytea; |
' |
| 92 | 反斜线 | E'\\\\'或E'\\134' |
SELECT E'\\\\'::bytea; |
\\ |
| 0到31和127到255 | "不可打印的"字节 | E'\\*xxx'*(八进制值) |
SELECT E'\\001'::bytea; |
\001 |
MogDB=# SELECT E'\''::bytea;
bytea
-------
\x27
(1 row)
MogDB=# SELECT E'\x6D'::bytea;
bytea
-------
\x6d
(1 row)
x27 对应十六进制ASCII 码的’
x6D对应十六进制的ASCII 码 的M
逃逸机制难于处理。种格式可能会在大部分新应用中不要使用。
二进制类型示例:
MogDB=# CREATE TABLE bin_test
MogDB-# (
MogDB(# COL1 RAW,
MogDB(# COL2 BYTEA
MogDB(# ) ;
CREATE TABLE
MogDB=# insert into bin_test values (HEXTORAW('4d6f674442'),E'\\x6d');
INSERT 0 1
MogDB=# select * from bin_test;
col1 | col2
------------+------
4D6F674442 | \x6d
(1 row)




