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

CockroachDB数据类型解密

CockroachDB 2021-07-14
1522

这期文章小编将和大家一起解密 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源码数据结构:

  1. // TString represents a STRING, CHAR or VARCHAR type.

  2. type TString struct {

  3.    Name string

  4.    N    int

  5. }


其他Alias源码数据结构:

  1. // Char is an immutable T instance.

  2. Char = &TString{Name: "CHAR"}

  3. // VarChar is an immutable T instance.

  4. VarChar = &TString{Name: "VARCHAR"}

  5. // String is an immutable T instance.

  6. String = &TString{Name: "STRING"}

  7. // Text is an immutable T instance.

  8. Text = &TString{Name: "TEXT"}


sql.y文件解析:

  1. // SQL character data types

  2. // The following implements CHAR() and VARCHAR().

  3. character:

  4.  character_with_length

  5. | character_without_length


  6. const_character:

  7.  character_with_length

  8. | character_without_length


  9. character_with_length:

  10.  character_base '(' iconst64 ')'

  11.  {

  12.    $$.val = $1.colType()

  13.    n := $3.int64()

  14.    if n != 0 {

  15.      strType := &coltypes.TString{N: int(n)}

  16.      strType.Name = $$.val.(*coltypes.TString).Name

  17.      $$.val = strType

  18.    }

  19.  }


  20. character_without_length:

  21.  character_base

  22.  {

  23.    $$.val = $1.colType()

  24.  }


  25. character_base:

  26.  CHARACTER opt_varying

  27.  {

  28.    $$.val = coltypes.Char

  29.  }

  30. | CHAR opt_varying

  31.  {

  32.    $$.val = coltypes.Char

  33.  }

  34. | VARCHAR

  35.  {

  36.    $$.val = coltypes.VarChar

  37.  }

  38. | STRING

  39.  {

  40.    $$.val = coltypes.String

  41.  }


  42. opt_varying:

  43.  VARYING {}

  44. | /* EMPTY */ {}



2、差异性

因为两个数据库底层编程语言之间的差别,因此,数据类型的细节上还是有所区别。MySQL的整形是区分有符号跟无符号数值,CockroachDB 的整形只有无符号。CockroachDB 跟 MySQL 在数据类型的约束条件的关键字基本一样,包括NULL、NOT NULL 、DEFAULT、 PRIMARY KEY等。值得注意的是,作为分布式数据库的 CockroachDB 在主键自增方面与单实例进程MySQL存在较大区别。


MySQL使用可关键字AUTO_INCREMENT实现主键自动递增且可指定自增步长。假如在分布式数据库中需要产生严格步长自增的主键,则每个节点与其他节点都需要通信协调,效率会变得极其低下。其次,在MySQL数据中假如出现事务回滚等操作,也会出现自增主键突变,并不严格保证自增的步长。因此,CockroachDB 采用了SERIAL数据类型的解决方案来满足分布式集群快速、稳定自增数据类型,如下所示:


  1. // GenerateUniqueInt creates a unique int composed of the current time at a

  2. // 10-microsecond granularity and the node-id. The node-id is stored in the

  3. // lower 15 bits of the returned value and the timestamp is stored in the upper

  4. // 48 bits. The top-bit is left empty so that negative values are not returned.

  5. // The 48-bit timestamp field provides for 89 years of timestamps. We use a

  6. // custom epoch (Jan 1, 2015) in order to utilize the entire timestamp range.

  7. //

  8. func GenerateUniqueInt(nodeID roachpb.NodeID) tree.DInt {

  9.    const precision = uint64(10 * time.Microsecond)

  10.    const nodeIDBits = 15


  11.    nowNanos := timeutil.Now().UnixNano()

  12.    // Paranoia: nowNanos should never be less than uniqueIntEpoch.

  13.    if nowNanos < uniqueIntEpoch {

  14.        nowNanos = uniqueIntEpoch

  15.    }

  16.    id := uint64(nowNanos-uniqueIntEpoch) precision


  17.    uniqueIntState.Lock()

  18.    if id <= uniqueIntState.timestamp {

  19.        id = uniqueIntState.timestamp + 1

  20.    }

  21.    uniqueIntState.timestamp = id

  22.    uniqueIntState.Unlock()


  23.    // We xor in the nodeID so that nodeIDs larger than 32K will flip bits in the

  24.    // timestamp portion of the final value instead of always setting them.

  25.    id = (id << nodeIDBits) ^ uint64(nodeID)

  26.    return tree.DInt(id)

  27. }





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有多年的内核开发经验及实践经验,对数据库和大数据领域有疑问或者需求欢迎联系我们,同时欢迎有志青年加入我们!



关注我们 



文章转载自CockroachDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论