mysql中int、bigint、smallint 和 tinyint的区别详细介绍
最近在做数据库表设计的时候,对于多种数字的数据类型的选择存在很多顾虑,不是很清楚到底如何选择。
mysql建模的过程中,对于优化来讲一个非常重要的点就是字段类型的设置,好的字段类型的设置可以帮助更快的查询数据同时能节约硬盘空间,这对于优化数据库来讲是非常重要的。
mysql的字段类型大体来讲分为int、text、varchar、char、blog等几种,而各自的类型中又划分了不同的字符数的类型,这里先来讨论几种整形的情况。
先来看一下基本的概念:字节(byte),1个字节等于8个位(bit),一个bit存储0或者1,理解这个对于理解后面的占用字节导致的存储数值的有很重要的作用。
整型,常见细分为tinyint、smallint、mediumint、int、bigint这几种。
1)tinyint:存储所占一个字节,一个字节等于8bit,根据1bit可以存储0到1两种可能性,因此tinyint类型可以存储2的8次方,也就是256种可能性,从0开始计数,无符号也就是可以 存储0~255,如果是有符号,那就是-128~127。
2)smallint:存储所占两个字节,同上也就是可以存储2的16次方,也就是可以存储65536种可能性,无符号从0开始则是可以存储0~65535,有符号则是-32768~32767。
3)mediumint:存储所占三个字节,也就是2的24次方,可以存储16777216种可能性,无符号可以存储0~16777215,有符号可以存储-8388608~8388607。
4)int:存储所占四个字节,也就是2的32次方,可以存储4294967296种可能性,无符号可以存储0~4294967295,有符号则是-2147483648~2147483647。
5)bigint:存储所占8个字节,也就是2的64次方,可以存储2的64次种可能性,无符号可以存储0~((2³²×²)-1),有符号则是-(2³²×²)/2 ~ (2³²×²)/2-1。
我们经常会见到int(11)、tinyint(1)这种后面跟括号里面放数字的情况,很多人以为这是代表的该类型可存储的长度,但是我们上面已经分析了存储的情况,这种理解肯定是不对的,实际上括号里的数字表示的是最大显示宽度,这个数字和存储大小及其类型没有任何关系,也就是说tinyint(1)和tinyint(3)都是存储一个字节,并不会因为括号里的数字改变,这个数字仅仅是显示最大宽度。
注意:mysql中虽然提供的语法中还有:tinyint(3)
这种形式,但我们完全可以忽略它,因为实在是用不上,就连mysql自己也说了(将来会被移除):
例如tinyint(3)存储11则会显示011,因为最大宽度为3,达不到的情况下用0来补充,这样的话就很好理解了,下图也是做了一定的对比,分别存储的是1和123456、1234567890这几个数字。
在设置这个括号里的数值时我们也要小心,因为mysql手册上明确写了:当 mysql 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度!
int(M) 在 integer 数据类型中,M 表示最大显示宽度。在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。和数字位数也无关系 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。
CREATE TABLE IF NOT EXISTS `jshop_bill_payments` (
`payment_id` varchar(20) NOT NULL COMMENT '支付单号',
`money` decimal(10,2) DEFAULT '0.00' COMMENT '支付金额',
`user_id` int(10) unsigned DEFAULT NULL COMMENT '用户ID 关联user.id',
`type` smallint(1) unsigned NOT NULL DEFAULT '1' COMMENT '资源类型1=订单,2充值单',
`status` tinyint(1) unsigned DEFAULT '1' COMMENT '支付状态 1=未支付 2=支付成功 3=其他',
`payment_code` varchar(50) DEFAULT NULL COMMENT '支付类型编码 关联payments.code',
`ip` varchar(50) DEFAULT NULL COMMENT '支付单生成IP',
`params` varchar(200) NOT NULL COMMENT '支付的时候需要的参数,存的是json格式的一维数组',
`payed_msg` varchar(255) DEFAULT NULL COMMENT '支付回调后的状态描述',
`trade_no` varchar(50) DEFAULT NULL COMMENT '第三方平台交易流水号',
`ctime` bigint(12) unsigned DEFAULT NULL COMMENT '创建时间',
`utime` bigint(12) unsigned DEFAULT NULL COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='支付单表';
DROP TABLE IF EXISTS `hysc_store_admin`;
CREATE TABLE `hysc_store_admin` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`store_id` INT(10) NOT NULL,
`uid` INT(10) NOT NULL,
`type` TINYINT(1) NOT NULL,
`name` VARCHAR(100) NOT NULL,
`real_name` VARCHAR(100) NOT NULL,
`password` VARCHAR(32) NOT NULL,
`original_password` VARCHAR(50) NOT NULL,
`authority` VARCHAR(200) NOT NULL,
`print_id` INT(10) NOT NULL,
`status` TINYINT(1) NOT NULL DEFAULT '1',
`create_time` INT(10) NOT NULL,
`delete_time` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT='店铺管理员表';
- bigint:从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。bigint已经有长度了,在mysql建表中的length,只是用于显示的位数。
- int:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。
- smallint:从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据。存储大小为 2 个字节。
- tinyint:从 0 到 255 的整型数据。存储大小为 1 字节。
2. c#中的使用方式
在c#中它们的使用方式
tinyint
占用1个byte,和c#中的byte、sbyte正好一一对应。
smallint
占用2个byte,和c#中的short、ushort正好一一对应。
mediumint
占用3个byte,在c#中没有类型与之一一对象,可以使用int、uint代替。
int
占用4个byte,和c#中的int、uint正好一一对应。
bigint
占用8个byte,和c#中的long、ulong正好一一对应
public class Model
{
/// <summary>
/// column: tinyint
/// </summary>
public sbyte? t_tinyint { get; set; }
/// <summary>
/// column: smallint
/// </summary>
public short? t_smallint { get; set; }
/// <summary>
/// column: mediumint
/// </summary>
public int? t_mediumint { get; set; }
/// <summary>
/// column: int
/// </summary>
public int? t_int { get; set; }
/// <summary>
/// column: bigint
/// </summary>
public long? t_bigint { get; set; }
/// <summary>
/// column: tinyint unsigned
/// </summary>
public byte? t_tinyint_unsigned { get; set; }
/// <summary>
/// column: smallint unsigned
/// </summary>
public ushort? t_smallint_unsigned { get; set; }
/// <summary>
/// column: mediumint unsigned
/// </summary>
public uint? t_mediumint_unsigned { get; set; }
/// <summary>
/// column: int unsigned
/// </summary>
public uint? t_int_unsigned { get; set; }
/// <summary>
/// column: bigint unsigned
/// </summary>
public ulong? t_bigint_unsigned { get; set; }
}
更多推荐
所有评论(0)