| 类型 | 
 | 字节 | 最小值 | 最大值 | 
| 
 | 
 | 
 | (带符号的/无符号的) | (带符号的/无符号的) | 
| TINYINT | 
 | 1 | -128 | 127 | 
| 
 | 
 | 
 | 0 | 255 | 
| SMALLINT | 
 | 2 | -32768 | 32767 | 
| 
 | 
 | 
 | 0 | 65535 | 
| MEDIUMINT | 
 | 3 | -8388608 | 8388607 | 
| 
 | 
 | 
 | 0 | 16777215 | 
| INT | 
 | 4 | -2147483648 | 2147483647 | 
| 
 | 
 | 
 | 0 | 4294967295 | 
| BIGINT | 
 | 8 | -9223372036854775808 | 9223372036854775807 | 
| 
 | 
 | 
 | 0 | 18446744073709551615 | 
在项目中主键使用BIGINT,而且是有符号的(因为无符号的运算时出现负数会报错)。
演示
create table test_unsigned(a int unsigned, b int unsigned);
insert into test_unsigned values(1, 2);
select b - a from test_unsigned; --运行正常
select a - b from test_unsigned; --运行出错
演示(需要在Linux上才能看出区别)
create table test_int_n(a int(4) zerofill);
insert into test_int_n values(1);
insert into test_int_n values(123456);
---结果,都能插入成功
l int(N)中的 N 是显示宽度, 不表示 存储的数字的 长度 的上限。
l zerofill 表示当存储的数字 长度 < N 时,用 数字0 填充左边,直至补满长度 N
l 当存储数字的长度 超过N时 ,按照 实际存储 的数字显示
这列语法有错误吗?
create table test_auto_increment(a int auto_increment);
---插入报错(非主键,不能自增)
create table test_auto_increment(a int auto_increment primary key);
---插入成功,主键能自增
以下结果是什么?
insert into test_auto_increment values(NULL);
--插入成功,值:1
insert into test_auto_increment values(0);
--插入报错(不能插入0)
insert into test_auto_increment values(-1);
--插入成功,值:-1
insert into test_auto_increment values(null),(100),(null),(10),(null)
-- 1,100,101,10,11 (从上一条数据の数据值+1 递增)
| 类型 | 说明 | N的含义 | 是否有字符集 | 最大长度 | 
| CHAR(N) | 定长字符 | 字符 | 是 | 255 | 
| VARCHAR(N) | 变长字符 | 字符 | 是 | 16384 | 
| BINARY(N) | 定长二进制字节 | 字节 | 否 | 255 | 
| VARBINARY(N) | 变长二进制字节 | 字节 | 否 | 16384 | 
| TINYBLOB(N) | 二进制大对象 | 字节 | 否 | 256 | 
| BLOB(N) | 二进制大对象 | 字节 | 否 | 16K | 
| MEDIUMBLOB(N) | 二进制大对象 | 字节 | 否 | 16M | 
| LONGBLOB(N) | 二进制大对象 | 字节 | 否 | 4G | 
| TINYTEXT(N) | 大对象 | 字节 | 是 | 256 | 
| TEXT(N) | 大对象 | 字节 | 是 | 16K | 
| MEDIUMTEXT(N) | 大对象 | 字节 | 是 | 16M | 
| LONGTEXT(N) | 大对象 | 字节 | 是 | 4G | 
当创建一个utf-8_ci排序规则的数据库,插入数据a、A执行下面操作:
select ‘a‘ = ‘A‘;
--结果:1 (数据库中用1和0表示true跟false)
create table test_ci (a varchar(10), key(a));
insert into test_ci values(‘a‘);
insert into test_ci values(‘A‘);
select * from test_ci where a = ‘a‘; --结果是什么?
--结果:a、A都显示出来了
重新设置当前字符排序规则后,再执行where a = ‘a‘ ....
set names utf8mb4 collate utf8mb4_bin
--结果:只有a显示
总结:MySQL中ci排序规则不区分大小写,bin排序规则区分大小写(转换成二进制比较)
| 日期类型 | 占用空间 | 表示范围 | 
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 
| TIMESTAMP | 4 | 1970-01-01 00:00:00UTC ~ 2038-01-19 03:14:07UTC | 
| YEAR | 1 | YEAR(2):1970-2070, YEAR(4):1901-2155 | 
| TIME | 3 | -838:59:59 ~ 838:59:59 | 
| datatime与timestamp区别 create table test_time(a timestamp, b datetime); insert into test_time values (now(), now()); select * from test_time; select @@time_zone; set time_zone=‘+00:00‘; select * from test_time; | 
datatime与timestamp区别:
1.timestamp有时区的概念。(存储时会转成MySQL默认时区存储,取值时会反转成服务器当前设置的时区时间显示)
datetime没有时区的概念。(存值是啥,取值就是啥)
2.timestamp占4个字节,也决定了它的最大存值时间是2038年(2038年之后的时间不能存放)
datetime占8个字节,最大存值到9999年
3.timestamp存值,默认是数据库当前时间,更新时也是取当前时间
datetime存值,默认是null
原文:https://www.cnblogs.com/Soy-technology/p/11037563.html