基本数据类型
以下描述了 DDL 编译器 mcocomp 所识别的数据类型:
基本类型
signed<n>
n 字节整数,n 等于 1、2、4 或 8。
{
signed<2> a_short;
};
unsigned<n>
非负 n 字节整数,n 等于 1、2、4 或 8。
{
unsigned<4> hall;
};
float
4 字节实数。
{
float rate;
};
double
8 字节实数。
{
double rate;
};
char<n>
固定长度的单字节字符数组,大小小于 64K。char 字段可以存储 C 类型的字符串或二进制数据。
对于 C 字符串,尾部的空字符无需存储,当提供的缓冲区大小足够,从数据库中读取字符串时会添加这些空字符。
{
char<8> name;
};
nchar<n>
固定长度的双字节字符数组,大小小于 64K。nchar 字段存储 2 字节字符,这些字符按照其数值进行排序。这适用于许多亚洲语言。
在数据结构中:
{
nchar<20> uname;
};
在C/C++ 程序中:
nchar_t uname[21];
wchar<n>
长度固定的双字节字符数组,大小小于 64K。wchar 字段存储的 Unicode 字符根据机器的区域设置进行排序。
在数据结构中:
{
wchar<20> uname;
};
在C/C++ 程序中:
wchar_t uname[21];
binary<n>
固定长度的字节数组,大小小于 64K。与 char<n> 类似,但构建索引或搜索时的比较方式不同。对于这些用途,字符数组具有自然的分隔符 '\0',用于标记比较部分的结束;而二进制数据则完全按照数组大小定义使用。它可以是类、结构体甚至直接结构体的字段。允许使用 binary<n> 的数组和向量。
{
binary<100> b;
binary<100> b_array[10];
vector<binary<100>> b_vector;
};
string
长度可变的单字节字符数组,大小小于 64K 字节。字节将按存储的原样返回给应用程序(最多为提供的缓冲区长度)。长度未知的 C 字符串应存储在字符串字段中以节省空间。出于与 char<n> 类型相同的原因,可以省略结尾的空字符。创建时,类型为 string 的字段仅包含一个 2 字节或 4 字节的空指针。在插入值并设置指针值为可变长度存储的地址(由 2 字节长度后跟主体组成)之前,不会分配存储空间。
{
string description;
};
nstring
长度可变的双字节字符数组,大小小于 64K。创建时,nstring 类型的字段仅包含一个 2 字节或 4 字节的空指针。在插入值并设置指针值为可变长度存储的地址(由 2 字节长度和主体组成)之前,不会分配存储空间。
在数据结构中:
{
nstring uname;
};
在C/C++ 程序中:
nchar_t *uname;
wstring
长度可变的双字节字符数组,大小小于 64K。在创建时,类型为 wstring 的字段仅包含一个 2 字节或 4 字节的空指针。直到插入值并设置指针值为可变长度存储的地址(由 2 字节长度后跟主体组成)时,才分配存储空间。
在数据结构中:
{
wstring uname;
};
在C/C++ 程序中:
wchar_t *uname;
varbinary
可变长度字节数组(类似于字符串类型,字符串是可变长度字符数组,但在比较时会使用字符串的所有字节)。可以是类或结构体的成员(使其具有可变长度)。但不能是直接结构体的字段;可以为空;允许 varbinary
类型的数组和向量。在创建时,varbinary
类型的字段仅包含一个 2 字节或 4 字节的空指针。直到插入值并设置指针值为可变长度存储的地址(由 2 字节长度和主体组成)时,才会分配存储空间。
{
varbinary vb;
varbinary vb_array[10];
vector<varbinary> vb_vector;
};
enum
用户定义的类型由一组名为枚举数的命名常量组成。每个枚举数的名称都被视为一个常量,并且在定义枚举的 DDL 模式的范围内必须是唯一的。枚举数可以提升为 unit1
、uint2
或 uint4
值。
enum FLOWCONTROL {
XON, CTS
};
class using_enum {
FLOWCONTROL fc;
};
numeric | decimal
numeric<W,P> =``decimal<W,P>
; W = 宽度,P = 精度,P <= W < 20 实际占用的存储空间由指定的宽度决定:
宽度 | 存储类型 |
---|---|
1 - 2 | signed<1> |
3 - 4 | signed<2> |
5 - 9 | signed<4> |
10 - 19 | signed<8> |
{
numeric<10,2> num;
decimal<8> dec;
};
sequence
一个序列是由支持的标量数据元素组成的无界数组,例如 [u]int[1|2|3|4|8]
、float 和 double 。
class quote
{
sequence<float> open;
sequence<float> close;
sequence<float> high;
sequence<float> low;
sequence<int4> volume;
sequence< time asc> timestamp;
};
blob
二进制数据对象;任意大小的字节数组,其大小可以超过 64K。
{
blob jpeg
};
vector
任何数据类型的可变长度数组,例如 signed
, unsigned
或 struct
。
struct A {
unsigned<2> a1;
char a2
};
class A_class {
vector <A> struct_array;
vector<unsigned<2>> numbers;
};
ref
通过对象的 oid
显式声明对对象的引用。
struct Id {
unsigned<2> a1;
char a2
};
declare oid Id[20000];
class A {
...
oid;
};
class B {
...
ref a; // 对 A 类对象的引用
};
autoid_t
通过对象的自动标识符(autoid_t
)明确声明对对象的引用。
class A {
...
autoid[20000];
};
class B {
...
autoid_t<A> a;
vector <autoid_t> va;
};
date
一个 32 位非负整数。尽管它可以用于以任何用户定义的格式存储日期值,但通常它被用于存储大多数 C/C++ 时间函数中使用的值,这些函数将整数值视为自 1970 年 1 月 1 日(纪元)以来的秒数。
{
date start_dt;
};
time
一个 32 位非负整数。尽管它可以用于以任何用户定义的格式存储时间值,但通常它被用于存储大多数 C/C++ 时间函数中所使用的值,这些函数将该整数值视为自 1970 年 1 月 1 日(纪元)以来的秒数。
{
time start_tm;
};
datetime
一个 64 位非负整数。它能够以更高的分辨率存储日期/时间,最高可达纳秒级。为了与 Java、C# 和 xSQL 兼容,C/C++ 应用程序必须以数据库的分辨率(通过 MCO_RT_OPTION_DATETIME_PRECISION
定义)存储日期/时间。
更多详细信息,请参阅 C 语言中管理日期时间字段的页面。
{
datetime start_dt;
};
boolean
固定大小的位数组。
{
boolean bits[8];
};
rect | rectangle
具有2,4,8字节整数、浮点或双坐标的矩形。
{
rectangle <uint2> u2[3];
rectangle <float> f[2];
};
可变长度字段引用
对于每个字符串、向量、序列、二进制大对象或可选结构体字段,在此类对象的数据布局中都会存储一个引用指针(2 字节或 4 字节)。实际的对象数据是单独存储的,并在访问对象时通过此引用地址进行检索。这可能会导致性能方面的考虑,尤其是在持久化数据库中。
字符串、二进制大对象和二进制字段
对于数据字段,建议仅当其大小超过1KB时采用二进制大对象(BLOB)字段。
若字段不用于索引且数据量不超过64KB,则推荐使用字符串字段,无需额外编码。
在SmartEDB中,字符串字段不仅限于ASCII字符,可以存储任意二进制数据。然而,字符串字段不能用于内部比较(如创建索引)或作为xSQL的参数。如果希望对二进制数据字段进行索引,则应选择二进制或可变二进制数据类型。与BLOB字段不同,这两种字段支持简单索引和复合索引。