【问题标题】:MySQL: From Boolean to Tinyint(1) and backMySQL:从 Boolean 到 Tinyint(1) 再返回
【发布时间】:2020-02-03 17:00:30
【问题描述】:

我不想挑剔,但是为什么在您将表列定义为布尔值的那一刻,在您尝试取回表结构的下一刻,它被返回为 tinyint(1)?

所以对于使用创建的表

CREATE TABLE IF NOT EXISTS `test` (
    `aField` BOOLEAN DEFAULT true
);

当我试图得到它的结构时

SHOW COLUMNS FROM test

我明白了

+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| aField | tinyint(1) | YES  |     | 1       |       |
+--------+------------+------+-----+---------+-------+

我对布尔值存储为 tinyint(1) 这一事实没有(大)问题,但我对 当你看到一个 tinyint(1) 的那一刻你不知道这一事实有疑问如果它最初是作为布尔值或作为存储小数字范围的小整数创建的。我看到 MySQL 文档(https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html)这么说

BOOL, BOOLEAN 这些类型是 TINYINT(1) 的同义词

但我不同意上述问题。

我可以运行任何其他查询来返回字段的原始(布尔)类型吗?

【问题讨论】:

    标签: mysql boolean sqldatatypes


    【解决方案1】:

    不,您无法区分创建为 BOOLEAN 的列和创建为 TINYINT(1) 的列。

    BOOLEAN 类型不存储在任何地方。它只是一个别名,在存储到数据库之前转换为 TINYINT(1)。您不会在列的元数据中找到任何提及 BOOLEAN 的内容。

    这就像你存储来自表达式ABS(?) 的整数值。您不知道传递给 ABS() 的原始值是正数还是负数,因为只存储了 ABS() 表达式的结果。

    顺便说一下,TINYINT(1) 并不意味着它只允许一个小的数字范围。很自然地认为 (1) 是大小限制,就像 CHAR 或 DECIMAL 一样。但是对于 MySQL 中的整数类型,它对数据类型的大小或它接受的值的范围没有影响。 TINYINT 始终是 8 位整数,接受 -128 到 127 的值,或者对于 TINYINT UNSIGNED,它始终接受 0 到 255 的值。

    另见我对https://stackoverflow.com/a/3135854/20860的回复

    【讨论】:

    • 这很不幸,特别是如果您尝试创建/使用 ORM,而 ORM 需要直接从数据库重新创建实体。
    • 执行 MySQL JDBC 驱动程序所做的事情:假设 TINYINT(1) 映射到布尔类型。见dev.mysql.com/doc/connector-j/8.0/en/…
    猜你喜欢
    • 2012-12-01
    • 2011-05-23
    • 2011-04-14
    • 2013-08-09
    • 2015-07-11
    • 2012-10-18
    • 2012-06-25
    • 2023-03-30
    • 2014-01-24
    相关资源
    最近更新 更多