繁体   English   中英

MySQL TINYINT(1)到BOOL

[英]MySQL TINYINT(1) to BOOL

列的数据类型上的参数究竟能做什么? 实质上:

我尝试了TINYINT(1),看来它只保留1或0。为什么它不显示/存储至少0-9?


编辑:事实证明,该问题不是MySQL问题,而是CakePHP的意外行为。 阅读我的答案以获取详细信息。 我将原始问题保留在下面,因此有用的答案将变得有意义。


我所做的:

我使用以下命令创建了一个MySQL表

CREATE TABLE table_name (
    ... irrelevant columns
    transaction_type TINYINT(1) NOT NULL COMMENT 'identifier from 0-5 (for now)'
);

并很快变得非常困惑,因为我无法在transaction_type列中存储0和1以外的值。

经过研究,我很自信地确定TINYINT (或任何其他整数数据类型)的参数只不过是一个以字符为单位的显示宽度。 我理解这意味着两件事:

  • 只要它在TINYINT的范围内,它仍应存储整个插入的值
  • 它只会显示一个字符,因此当我从表格中选择时,我应该能够看到0-9的值。

我认为这些假设中至少有一个(或者我对参数整体的理解)一定是错误的,因为每当我尝试在该列中插入大于1的值时,它将显示1。

然后,我尝试:

ALTER TABLE table_name CHANGE transaction_type transaction_type TINYINT;

然后我突然能够插入想要的任何值。 但是,即使上述命令更改了整个表,先前的插入值仍为1,这使我怀疑它们是否确实存储为1。

我是在误解显示器的宽度,还是在做其他完全错误的事情?

旁:如果我不在乎整数列在表中的外观,是否有理由向其中一个提供参数? 即INT(11)在某种程度上比INT好吗?

一个类似的问题可能应该对我更有用: MySql:Tinyint(2)vs tinyint(1)-有什么区别?

我能找到的最清晰的资料来解释显示宽度: http : //matt.thomm.es/archive/2006/11/28/mysql-integer-columns-and-display-width

简而言之:如果已在column上启用ZEROFILL ,则仅取决于填充零的整数的数量


更长的解释:

SQL中整数的长度不会更改其保留的数字( TINYINT将保留-128到127,但是无符号TINYINT将保留0-255等。无论长度如何。)

我真的很喜欢MySQL备忘单来检查大小。

现在INTINT(3)之间的实际区别是什么? 这很简单。 如果启用了ZEROFILL ,则将对该整数进行零填充。 那是唯一的区别。

这里有一篇很好的文章对此进行解释。

具体来说,是从文章中复制的(请查看!获取他的页面浏览量!)

mysql> select * from b;  
+-------+ | b     |  
+-------+ | 10000 |  
+-------+ 1 row in set (0.00 sec)      

mysql> alter table b change b b int(11) zerofill; 
Query OK, 1 row   affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0      

mysql> select * from b;  
+-------------+ | b           |  
+-------------+ | 00000010000 |  
+-------------+ 1 row in set (0.00 sec) 

事实证明CakePHP假定TINYINT(1)应该是布尔类型,因为MySQL将BOOL别名为TINYINT(1)。 因此,任何“真”值(例如大于1的值)都被分配为1,而任何“假”值均被分配为零。

对疲倦的旅行者的警告:当使用TINYINT(1)时,CakePHP可能会在没有警告的情况下更改您的值。

这里的老CakePHP错误

TINYINT后面的括号中的数字仅用于显示目的-与MySQL在此字段中用于存储值的字节数无关,与该字段中的值范围无关。 括号中的数字仅用于指定当您使用MySQL的客户端运行查询时,此字段中将显示多少位数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM