MySQL:从 Boolean 到 Tinyint(1) 再返回

标签 mysql boolean sqldatatypes

我不想挑剔,但为什么在您将表列定义为 boolean 值的那一刻,在您尝试取回表结构的那一刻,它却作为 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       |       |
+--------+------------+------+-----+---------+-------+

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

BOOL, BOOLEAN These types are synonyms for TINYINT(1)

但我不同意上述问题。

是否有任何其他我可以运行的查询会返回字段的原始( boolean )类型?

最佳答案

不,您无法区分创建为 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 的回答

关于MySQL:从 Boolean 到 Tinyint(1) 再返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58251926/

相关文章:

php - 如果一个为空,如何将变量分配给两个字符串之一?

ios - 警告开关条件具有 boolean 值

sql - Postgres 中数字数据类型的精度和小数位数是什么?

MySQL 总是将 BIT 值返回为空白

java - 空指针异常

mysql - 出现次数的订单记录 "in array"

java - 使用 H2 插入外键时出现问题

php在html中显示mysql表

cocoa-touch - 在应用程序关闭时存储一个 BOOL

c# - 你如何使用 SqlDataRecord 处理 Nullable 类型