如何使用sequelize ORM将列定义为tinyint(4)

时间:2016-08-11 11:35:48

标签: mysql sql node.js sequelize.js

我需要将我的表定义为

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `o_id` int(11) unsigned NOT NULL,
  `m_name` varchar(45) NOT NULL,
  `o_name` varchar(45) NOT NULL,
  `customer_id` int(11) unsigned NOT NULL,
  `client_id` tinyint(4) unsigned DEFAULT '1',
  `set_id` tinyint(4) unsigned DEFAULT NULL,
  `s1` tinyint(4) unsigned DEFAULT NULL,
  `s2` tinyint(4) unsigned DEFAULT NULL,
  `s3` tinyint(4) unsigned DEFAULT NULL,
  `review` varchar(2045) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `br_o_id_idx` (`order_id`),
  KEY `br_date_idx` (`created_at`),
  KEY `br_on_idx` (`operator_name`),
  KEY `br_mn_idx` (`merchant_name`)
)

但正如我在寻找sequelize文档时,它不支持其大小的int。

2 个答案:

答案 0 :(得分:3)

对于MySQL,Sequelize.BOOLEAN数据类型映射到TINYINT(1)。参见

https://github.com/sequelize/sequelize/blob/3e5b8772ef75169685fc96024366bca9958fee63/lib/data-types.js#L397

http://docs.sequelizejs.com/en/v3/api/datatypes/

如@ user866762所述,括号中的数字仅影响数据的显示方式,而不影响数据的存储方式。因此,TINYINT(1)与TINYINT(4)应该对您的数据没有影响。

答案 1 :(得分:1)

由于表定义中缺少ZERO_FILL,我怀疑tinyint(4)可能不会按照您的想法执行。来自11.2.5 Numeric Type Attributes

  

MySQL支持扩展,可选择在类型的base关键字后面的括号中指定整数数据类型的显示宽度。

     

...

     

显示宽度不会限制可以存储在列中的值的范围。

     

...

     

例如,指定为SMALLINT(3)的列的通常SMALLINT范围为-32768到32767,超出三位数允许的范围之外的值将使用超过三位数完整显示。

我不确定其他RDBMS是否会以不同方式处理这些数字,但是通过仔细阅读sequelize source,它们看起来就像是在同一个,不正确的印象中。

话虽如此,您的架构的重要部分是,您希望将这些字段存储为TINYINT s(仅使用一个存储字节来包含0到255之间的值),遗憾的是, Sequelize DataTypes。我可能会建议打开PR来添加它......

另一方面,如果您真的在寻找ZEROFILL功能,并且需要指定显示宽度为4,那么您可以执行类似Sequelize.INTEGER(4).ZEROFILL的操作,但很明显,在你的数据库中浪费太多空间。