Cra*_*lus 19 mysql datatypes mysql-5.5
当我们使用数字数据类型的参数长度时,据我所知,这指定了显示宽度。
我尝试了以下方法:
mysql> create table boolean_test (var1 boolean, var2 tinyint);
Query OK, 0 rows affected (0.10 sec)
mysql> show create table boolean_test;
+--------------+-------------------------
| Table | Create Table
+--------------+-------------------------
| boolean_test | CREATE TABLE `boolean_test` (
`var1` tinyint(1) DEFAULT NULL,
`var2` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------+---------------------------
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
首先 tinyint 是一个 1 字节的值。那么是什么意思tinyint(4)呢?不能有 4 位数字。
mysql> insert into boolean_test values(101,112);
Query OK, 1 row affected (0.03 sec)
mysql> select * from boolean_test;
+------+------+
| var1 | var2 |
+------+------+
| 10 | 112 |
| 101 | 112 |
+------+------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我看到在 tinyint 中我存储了 10 和 101,尽管它被定义为 tinyint(1),但我可以取回这些值。
我不应该看到 1var1吗?即只有 1 个显示数字?
Shl*_*ach 25
数据明智的,tinyint(1),tinyint(2),tinyint(3)等都是完全一样的。它们都在 -128 到 127SIGNED或 0-255的范围内UNSIGNED。正如其他答案指出的那样,括号中的数字只是一个显示宽度提示。
不过,您可能要注意,application=wise 的东西可能看起来不同。在这里,tinyint(1)可以带一个特殊的含义。例如,Connector/J(Java 连接器)将其tinyint(1)视为布尔值,而不是将数值结果返回给应用程序,而是将值转换为true和false。这可以通过tinyInt1isBit=false连接参数进行更改。
Phi*_*lᵀᴹ 14
由于数据类型为 8 位(1 个字节),tinyint(1) 可以保存 -128 到 127 范围内的数字 - 显然无符号 tinyint 可以保存 0-255 的值。
它将以静默方式截断超出范围的值:
mysql> create table a
-> (
-> ttt tinyint(1)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from a;
+------+
| ttt |
+------+
| 127 |
| -128 |
| 127 |
| -128 |
+------+
4 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
...除非您更改sql_mode或更改服务器配置:
mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>
Run Code Online (Sandbox Code Playgroud)
DDL 中用于数据类型的值(例如:tinyint(1))是您所怀疑的显示宽度。但是,它是可选的,客户不必使用它。例如,标准 MySQL 客户端不使用它。
| 归档时间: |
|
| 查看次数: |
49817 次 |
| 最近记录: |