16

为什么TINYINT(1)作为布尔值工作?我理解官方文档的方式,(1)应该意味着它的显示宽度为1,所以如果我存储56在其中,我认为它应该打印5。但由于某种原因,它总是打印1or 或0.

另一种情况是,如果我存储56在一个 中INT(1),那么它会打印56(至少根据 SQLFiddle)。这里发生了什么?

4

5 回答 5

23

MySQL 整数类型的括号中的 (1) 与数据类型接受的值的范围或它的存储方式无关。它只是为了展示。

另请参阅我对 MySQL 中的类型的回答:BigInt(20) vs Int(20) 等

TINYINT 与 TINYINT(1) 或 TINYINT(2) 或 TINYINT(64) 没有什么不同。它是一个 8 位有符号整数数据类型,它接受从 -128 到 127 的任何 8 位整数值。

mysql> create table b (i tinyint(1));

mysql> insert into b values (42);

mysql> select * from b;
+------+
| i    |
+------+
|   42 |
+------+

为方便起见,MySQL 支持 BOOL 的别名,该别名立即被 TINYINT(1) 替换。

mysql> create table b2 (i bool);

mysql> show create table b2;

CREATE TABLE `b2` (
  `i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

正如我所说,使用 (1) 几乎没有任何意义,它只是一种约定,因此如果您看到 TINYINT(1),则可以合理地假设该列旨在用作布尔值。但是 MySQL 中没有任何东西可以阻止您在其中存储其他整数值。

如果您希望一列接受0 或 1,则可以使用 BIT(1):

mysql> create table b3 (i bit(1));

mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1

mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1

与 TINYINT 相比,这并没有节省任何空间,因为给定列的存储会向上舍入到最接近的字节。

PS:尽管@samdy1 的回答,TINYINT 不存储字符串 '0'或根本不存储整数'1',它存储整数 01,以及从-128 到 127 的其他整数。SQL 中不需要引用整数,我经常不明白为什么会这样许多开发人员都这样做。

于 2013-05-28T18:43:23.193 回答
9

TINYINT列可以存储从-128到 的数字127

TINYINT(1)不过有点奇怪。它是(可能是因为它应该充当BOOLEAN数据类型),仅在某些上下文中返回01同时它仍然保留存储的(-128 到 127)值。

更正:我只在 SQL-Fiddle 中看到这种奇怪的行为,而不是在本地访问 MySQL 时,所以它很可能是 SQL-Fiddle 的怪癖,可能与与 quivalence 相关BOOLEAN)而不是 MySQL 问题。

请参阅SQL-Fiddle

CREATE TABLE test
( i TINYINT(1)
) ;

INSERT INTO test 
  (i)
VALUES
  (0),  (1), (6), (120), (-1) ;

我们得到的地方(仅在 SQL-Fiddle 中,否则如果我们访问 MySQL 则不会!):

SELECT i
FROM test ;

  i
-----
  0
  1
  1
  1
  1

但:

SELECT CAST(i AS SIGNED) i2
FROM test ;

  i2
-----
   0
   1
   6
 120
  -1
于 2013-05-28T18:40:33.510 回答
8

This is a mysql Jdbc configuration subject.

You can config mysql jdbc to convert TinyInt(1) to Boolean or Integer through set jdbc url config property "tinyInt1isBit" to "true" (default) or "false".

from: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Should the driver treat the datatype TINYINT(1) as the BIT type (because the server silently converts BIT -> TINYINT(1) when creating tables)?

Default: true

于 2016-02-18T17:19:44.933 回答
3

引擎足够聪明,知道这一点TINYINT(1)并且BOOL是相同的。但是INT(1)只影响显示宽度而不是基础存储大小。仅当值小于显示宽度时,显示宽度才起作用。然后它被填充。

http://alexander.kirk.at/2007/08/24/what-does-size-in-intsize-of-mysql-mean/

于 2013-05-28T18:26:43.647 回答
0

据我了解,TINYINT(1)只能持有'0''1'(根据自己的经验)。
因此,可以假设'0'or'1'被翻译成trueor false

于 2013-05-28T18:20:35.710 回答