暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

循序渐进 |MogDB 数据类型的支持三(ID 9959)

由迪 2024-09-02
134

上一期介绍了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)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论