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

Atu*_*wal 4 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`)
)
Run Code Online (Sandbox Code Playgroud)

但当我查看sequelize文档时,它不支持其大小的tiny int。

Wil*_*ill 5

由于您的表定义中缺少ZERO_FILL,我怀疑tinyint(4)可能不会按照您的想法进行操作。从11.2.5 数字类型属性开始:

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

...

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

...

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

我不确定其他 RDBMS 是否以不同的方式处理括号中的数字,但通过仔细阅读续集源代码,它们看起来与您的印象相同,但不正确。

话虽如此,架构的重要部分,即您希望将这些字段存储为TINYINTs(仅使用一个存储字节来包含 0-255 之间的值),遗憾的是在 Sequelize 数据类型中不可用。我可能建议打开一个 PR 来添加它......

另一方面,如果您确实正在寻找 ZEROFILL 功能,并且需要指定显示宽度为 4,您可以执行类似的操作Sequelize.INTEGER(4).ZEROFILL,但显然,这会非常浪费数据库中的空间。


Jef*_*ide 5

对于 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) 应该对您的数据没有影响。