我不想吹毛求疵,但为什么在下一次尝试获取表结构时,将表列定义为布尔型,而将其返回为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       |       |
+--------+------------+------+-----+---------+-------+

我对布尔值存储为tiny int(1)这个事实没有(大的)问题,但我对这样一个事实有一个问题:当你看到tinyint(1)时,你不知道它最初是作为布尔值创建的,还是作为一个小的int来存储小的数字范围。我看到MySQL文档(https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html)说
BOOL,BOOLEAN这些类型是TINYINT(1)的同义词
但我不同意上述问题。
有没有其他查询可以返回字段的原始(布尔)类型?

最佳答案

不,您无法区分创建为BOOLEAN的列和创建为TINYINT(1)的列。
布尔类型未存储在任何位置。它只是一个别名,在被存储到数据库之前,它被转换成TINYINT(1)。在列的元数据中找不到任何布尔值。
这就像是存储表达式ABS(?)中的整数值。您不知道传递给ABS()的原始值是正值还是负值,因为只存储ABS()表达式的结果。
顺便说一下,TINYINT(1)并不意味着它只允许很小的数字范围。很自然地认为(1)是一个大小限制,就像对于CHAR或DECIMAL一样。但是对于MySQL中的整数类型,它对数据类型的大小或它接受的值的范围没有影响。TINYINT始终是8位整数,接受-128到127之间的值,或者对于TINYINT UNSIGNED,它始终接受0到255之间的值。
另请参见我对https://stackoverflow.com/a/3135854/20860的回答

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

10-11 05:21