这期文章小编将和大家一起解密 CockroachDB 的基本数据类型,从目前 CockroachDB 常用数据类型、CockroachDB 与 MySQL 数据类型差异、CockroachDB 数据类型转换等几个方面说明。
CockroachDB常用数据类型
1.数值类型
CockroachDB 支持标准SQL数值类型,包括严格数值类型(INT、DECIMAL、SERIAL),近似数值类型(FLOAT)
类型 | 大小 | 别名 | 备注 |
INT | 64 bit | INTEGER INT8 INT64 BIGINT | 有符号类型 |
INT4 | 32 bit | None | |
INT2 | 16 bit | SMALLINT | |
BIT | 1 bit | None | |
BIT(n) | n bit | None | 1<n<64 |
DECIMAL | 可变 | DEC NUMERIC | |
SERIAL | 64 bit | SMALLSERIAL BIGSERIAL | 全局自增,等同于INT DEFAULT unique_rowid() |
FLOAT | 可变 | None | 最大长度可达64bit,精度可达17位 |
REAL | 可变 | FLOAT4 | |
DOUBLE PRECISION | 可变 | FLOAT8 |
2.日期与时间类型
CockroachDB 支持时间类型包括日期DATE、时间戳TIMESTAMP、时间间隔INIERVAL
类型 | 大小 | 别名 | 格式 |
DATE | 8 Bytes | None | YYYY-MM-DD |
TIMESTAMP | 12 Bytes | TIMESTAMP WITHOUT TIME ZONE | |
TIMESTAMPTZ | 12 Bytes | TIMESTAMP WITH TIME ZONE | TIMESTAMP '2016-01-25' TIMESTAMP '2016-01-25 10:10:10.555555' TIMESTAMP '2016-01-25T10:10:10.555555' |
3.字符串类型
CockroachDB 支持Unicode编码字符串类型STRING、语言本地化字符串类型COLLATE、二进制字符串BYTES
类型 | 大小 | 别名 | 格式 |
STRING | 可变,建议不超过64KB | CHARACTER CHAR VARCHAR TEXT | |
STRING(n) | 最大n个Unicode编码字符长度 | CHARACTER(n) CHAR(n) VARCHAR(n) CHARACTERVARYING (n) CHAR VARYING(n) | |
COLLATE | 同STRING | None | 特殊STRING类型,可按照指定的语言对字符串进行排序 |
BYTES | 可变,建议不超过1MB | BYTEA BLOB | 字符数组类型字符串 |
4.其他类型
CockroachDB 还支持128bit全局唯一标志数据类型UUID、布尔值、数组ARRAY
类型 | 大小 | 别名 | 格式 |
BOOL | 1 Byte | BOOLEAN | |
UUID | 128 Bits | None | 遵循RCF4122 |
ARRAY | 可变 | 一维单一类型元素数组 |
CockroachDB与MySQL数据类型差异
1、兼容性
CockroachDB 跟 MySQL 均支持标准SQL数据类型。因此,两者数据类型的定义和使用方法上基本相近。从实现上看,CockroachDB 实现的数据类型相对较少,但通过别名的方式提供了映射,比如将VARCHAR、CHAR等映射成STRING类型,映射的原理如下所示。在CockroachDB 中STRING 的数据结构是定义了类型string长度N 。
STRING源码数据结构:
// TString represents a STRING, CHAR or VARCHAR type.type TString struct {Name stringN int}
其他Alias源码数据结构:
// Char is an immutable T instance.Char = &TString{Name: "CHAR"}// VarChar is an immutable T instance.VarChar = &TString{Name: "VARCHAR"}// String is an immutable T instance.String = &TString{Name: "STRING"}// Text is an immutable T instance.Text = &TString{Name: "TEXT"}
sql.y文件解析:
// SQL character data types// The following implements CHAR() and VARCHAR().character:character_with_length| character_without_lengthconst_character:character_with_length| character_without_lengthcharacter_with_length:character_base '(' iconst64 ')'{$$.val = $1.colType()n := $3.int64()if n != 0 {strType := &coltypes.TString{N: int(n)}strType.Name = $$.val.(*coltypes.TString).Name$$.val = strType}}character_without_length:character_base{$$.val = $1.colType()}character_base:CHARACTER opt_varying{$$.val = coltypes.Char}| CHAR opt_varying{$$.val = coltypes.Char}| VARCHAR{$$.val = coltypes.VarChar}| STRING{$$.val = coltypes.String}opt_varying:VARYING {}| /* EMPTY */ {}
2、差异性
因为两个数据库底层编程语言之间的差别,因此,数据类型的细节上还是有所区别。MySQL的整形是区分有符号跟无符号数值,CockroachDB 的整形只有无符号。CockroachDB 跟 MySQL 在数据类型的约束条件的关键字基本一样,包括NULL、NOT NULL 、DEFAULT、 PRIMARY KEY等。值得注意的是,作为分布式数据库的 CockroachDB 在主键自增方面与单实例进程MySQL存在较大区别。
MySQL使用可关键字AUTO_INCREMENT实现主键自动递增且可指定自增步长。假如在分布式数据库中需要产生严格步长自增的主键,则每个节点与其他节点都需要通信协调,效率会变得极其低下。其次,在MySQL数据中假如出现事务回滚等操作,也会出现自增主键突变,并不严格保证自增的步长。因此,CockroachDB 采用了SERIAL数据类型的解决方案来满足分布式集群快速、稳定自增数据类型,如下所示:
// GenerateUniqueInt creates a unique int composed of the current time at a// 10-microsecond granularity and the node-id. The node-id is stored in the// lower 15 bits of the returned value and the timestamp is stored in the upper// 48 bits. The top-bit is left empty so that negative values are not returned.// The 48-bit timestamp field provides for 89 years of timestamps. We use a// custom epoch (Jan 1, 2015) in order to utilize the entire timestamp range.//func GenerateUniqueInt(nodeID roachpb.NodeID) tree.DInt {const precision = uint64(10 * time.Microsecond)const nodeIDBits = 15nowNanos := timeutil.Now().UnixNano()// Paranoia: nowNanos should never be less than uniqueIntEpoch.if nowNanos < uniqueIntEpoch {nowNanos = uniqueIntEpoch}id := uint64(nowNanos-uniqueIntEpoch) precisionuniqueIntState.Lock()if id <= uniqueIntState.timestamp {id = uniqueIntState.timestamp + 1}uniqueIntState.timestamp = iduniqueIntState.Unlock()// We xor in the nodeID so that nodeIDs larger than 32K will flip bits in the// timestamp portion of the final value instead of always setting them.id = (id << nodeIDBits) ^ uint64(nodeID)return tree.DInt(id)}
CockroachDB数据类型转换
CockroachDB 不同类型的数据类型间可相互转换,在讨论转换的方法之前,先简单介绍普及下 CockroachDB 五种基本的SQL字面值。
String literals: 字符串类型,例如’hello’
Numeric literals: 数至类型,例如 -12.3.
Byte array literals: 字符数组类型, 例如 b'hello'.
Interpreted literals: 指明类型,如INTERVAL '3 days'.
Named constants: 约定俗成的类型, 如 TRUE or NULL.
简单了解后我们正式介绍目前CockroachDB 支持的三种显示类型转换:
1、<type> 'string literal'
使用type关键字将字符串类型转换成相应的类型,比如DATE '2008-12-21', INT '123', or BOOL 'true';
2、 <value>::<data type>
从某种内建类型转化为另外相应的类型,比如NOW()::DECIMAL, VARIANCE(a+2)::INT
假如我们有张表格,表结构如下:

试图直接插入TIMESTMAP类型至DATE类型,则报错,解决办法就是使用”::”符号做类型转换。

3、内建函数,如to_ip(),from_ip(),to_uuid()
采用内建函数从一个类型转换成另一个类型

关于我们:我们是百度DBA团队,团队有两位CockroachDB PMC Member及一位Contributor, 目前正积极推动NewSQL在百度内部以及外部的发展。除了NewSQL, 我们在MySQL, PostgreSQL, GreenPlum有多年的内核开发经验及实践经验,对数据库和大数据领域有疑问或者需求欢迎联系我们,同时欢迎有志青年加入我们!
关注我们





