【问题标题】:MySql: Tinyint (2) vs tinyint(1) - what is the difference?MySql:Tinyint (2) 与 tinyint(1) - 有什么区别?
【发布时间】:2012-10-02 03:20:36
【问题描述】:

我知道 mysql 中的布尔值是 tinyint (1)

今天我看到一个表定义了一个整数,比如tinyint(2),还有其他的比如int(4)int(6) ...

integer 和 tinyint 类型字段的大小是什么意思?

【问题讨论】:

  • 阅读 MySQL 整数数据类型here
  • @AamirR 的答案是正确的
  • @evilReiko zerofill 对值的存储方式也没有影响,它实际上是关于表示......空格或零并没有真正影响任何人答案的正确性imo

标签: mysql sqldatatypes


【解决方案1】:

表示显示宽度

无论你使用 tinyint(1) 还是 tinyint(2),都没有任何区别。

我总是使用 tinyint(1) 和 int(11),我使用了几个 mysql 客户端(navicat、sequel pro)。

这根本没有任何意义!我跑了一个测试,上面所有的客户端甚至命令行客户端似乎都忽略了这一点。

但是,如果您使用ZEROFILL 选项,显示宽度是最重要的,例如您的表格有以下两列:

A tinyint(2) zerofill

B tinyint(4) zerofill

两列的值都是 1,A 列的输出将是 01B0001,如下面的屏幕截图所示:)

【讨论】:

  • 奇怪的是,我刚刚发现在 C# 官方 MySQL 连接器中 tinyint(1) 永远不会返回不同于 0 和 1 的值。这可能与 tinyint(1) 自动被识别为布尔值有关。只是提醒一下,有时这很重要。
  • 使用整数类型和长度不是更好吗?我的印象是这在 MySQL 中节省了内存。
  • 正如@Daniel-Sharp 指出的那样,它似乎对连接器很重要。刚刚使用 JDBC 报告 Hibernate 出现问题,它将 TINYINT(1) 解释为 BIT。
  • @DanielSharp 这可能是由于连接选项 tinyInt1isBit 默认为真。见dev.mysql.com/doc/connector-j/8.0/en/…
  • 我一直认为这与接受的数字数量有关(例如,int(4) 不允许任何高于 9999 的数字)。我想我那时总是想错了。在 PHP 和 MySQL 命令行中,我都能看到它上面的值。
【解决方案2】:

(m)表示列显示宽度; MySQL 客户端等应用程序在显示查询结果时会使用此功能。

例如:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

这里abc分别使用TINYINT(1)TINYINT(2)TINYINT(3)。如您所见,它使用显示宽度填充左侧的值。

请务必注意,它不会影响该特定类型的可接受值范围,即TINYINT(1) 仍接受[-128 .. 127]

【讨论】:

  • “列宽”是什么意思??
  • @realtebo 主要用于mysql命令行客户端进行显示。
  • 界面显示的“位数”个数。换句话说,它将在左侧填充零。这种特性在数据库的早期是有一定意义的,但现在它只是遗留下来的。
  • @Kailas 如果您不使用 mysql 客户端?一个都没有。
  • @Kailas 不! tinyint(1) 不只接受 0-9。它接受 tinyint 可以容纳的所有内容。
【解决方案3】:
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

【讨论】:

  • 请编辑您的答案以包含一些解释。仅代码的答案对教育未来的 SO 读者几乎没有作用。您的答案因质量低劣而在审核队列中。
【解决方案4】:

关于INT、TINYINT...这些是不同的数据类型,INT是4字节数,TINYINT是1字节数。更多信息在这里 - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT

TINYINT 数据类型的语法是 TINYINT(M),其中 M 表示最大显示宽度(仅在您的 MySQL 客户端支持时使用)。

Numeric Type Attributes.

【讨论】:

  • “显示宽度”是什么意思!?
  • 来自参考 - 例如,INT(4) 指定显示宽度为四位的 INT。应用程序可以使用这个可选的显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格向左填充它们。
  • 但我还没有看到使用此功能的应用程序或 MySQL 客户端。我总是使用 INT(11) 并使用格式化函数来自定义输出。
猜你喜欢
  • 2013-01-18
  • 2012-02-13
  • 2010-09-22
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多