2017-02-17 103 views
1

环境:同步模型修改UNSIGNED BIGINT为UNSIGNED BIGINT(19)

  • 的Ubuntu 14.04
  • MySQL工作台6.2.4
  • MariaDB的10

当我尝试同步模型与数据库模式和我有一个表定义类型UNSIGNED BIGINT(即UNSIGNED BIGINT(20)),然后它变成UNSIGNED BIGINT(19)。

正向工程的相同过程对这些数据类型正常工作。

型号

model

同步模式

Synchronizing model

CREATE TABLE IF NOT EXISTS `test`.`table` (
    `id` BIGINT(19) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_general_ci; 

正向工程

forward engineering

CREATE TABLE IF NOT EXISTS `test.`table1` (
`id` BIGINT UNSIGNED NOT NULL, 
PRIMARY KEY(`id`)) 
ENGINE = InnoDB; 

难道是在MySQL工作台的错误吗?

回答

0

我找到的解决方案是定义像

UNSIGNED BIGINT(20) --OK 

,而不是

UNSIGNED BIGINT --KO 

德式的MySql bug


在实践中似乎并没有影响,因为我们可以看到在示例中 示例

create table test.biginttest (a BIGINT, b BIGINT(10), c BIGINT(15) ZEROFILL); 

INSERT INTO test.biginttest VALUES (-10,10,-10); 

INSERT INTO test.biginttest VALUES (9223372036854775808,9223372036854775808,9223372036854775808); 

select * from test.biginttest; 

结果

enter image description here

1

之类的东西(19)上的BIGINT(和其他INTs)到底意味着什么。它是否存在并不重要。数字也不重要;即(20)也可以。

所有的味道都会编译和执行完全相同。

+0

唯一的区别是它可以只保存19位数字而不是20位 – Joe

+0

编号A'BIGINT' _always_有64位的空间,其中一个可能是符号('SIGNED',默认值,'UNSIGNED ')。如果你还说'ZEROFILL',那么'(n)'说“用'0s'填充输出'n'数字(这是一个很少使用的功能。) –

+0

类似地,'INT'总是有32位的空间('SIGNED':+/- 20 billion;'UNSIGNED':0-40亿 - 通常绰绰有余''id')。 32位= 4字节,是'BIGINT'大小的一半。 –