关于MySQL数据类型定义的几个细节-INT(N)/VARCHAR(N)/DECIMAL(M,N)

本文详细探讨了MySQL数据类型INT(N)、VARCHAR(N)和DECIMAL(M,N)的定义及差异。INT(N)的N仅影响显示,不影响存储和计算;VARCHAR(N)的N代表最大字符数,存储空间根据实际长度而变;DECIMAL(M,N)用于精确小数,M是总位数,N是小数位数。在存储和计算效率上,应根据实际需求合理选择数据类型。" 83212239,7984929,Ubuntu16.04+Tesla P100+CUDA8.0+CUDNN7.0.5详细配置指南,"['服务器配置', 'Linux', 'CUDA', 'CUDNN', 'GPU计算']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于MySQL数据类型定义的几个细节:
(1)INT(N)中,这个N表示啥?如:INT(2)和INT(11)有什么区别?
(2)VARCHAR(N)这个N表示啥?既然VARCHAR是可变长度的,VARCHAR(2)和VARCHAR(200)是不是一样?如果不一样区别在哪儿?
(3)DECIMAL(M,N)中的M和N又表示啥?如果定义字段类型为DECIMAL(10,2),那么当插入数据3.2455时,实际插入的值是什么?

1.Int(N)

存储整数,可以使用这几种数据类型,TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别使用8,16,24,32,64位存储空间,储值范围为-2E(N-1)到2E(N-1)-1.

这些类型决定了Mysql是怎么在内存和磁盘中存储数据的,但是在计算机中一般使用64位的BigInt整数,即使在32位环境中。

Mysql可以指定类型的宽度,比如int(10), 对大多数应用这是没有意义的。因为,这不会限制值得合法范围,只是规定了Mysql的一些交互工具(例如Mysql命令行客户端)的显示字符的个数。对于储存和计算来说,int(10)和int(2)是一样的。

测试

CREATE TABLE `int_n` (
  `int2` int(2) DEFAULT NULL,
  `int10` int(10) DEFAULT NULL,
  `vchar5` varchar(5) DEFAULT NULL,
  `vchar20` varchar(20) DEFAULT NULL,
  `decimal5_2` decimal(5,2) DEFAULT NULL,
  `decima10_2` decimal(10,2) DEFAULT NULL,
  `decimal_` decimal(10,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO int_n VALUES (10000,10000,'abcde','abcdefghijklmn',236.123,236.123,236.123);

INSERT INTO int_n VALUES (1,10000,'abcde','abcdefghijklmn',236.123456,236.123456,236.123456);

INSERT INTO int_n VALUES (10000,10000,'abcdefghijklmn','abcdefghijklmn',236.123,236.123,236.123); -- Data too long for column 'vchar5' at row 1

执行select *;结果:

mysql> select * from int_n;
+-------+-------+--------+----------------+------------+------------+----------+
| int2  | int10 | vchar5 | vchar20        | decimal5_2 | decima10_2 | decimal_ |
+-------+-------+--------+----------------+------------+------------+----------+
| 10000 | 10000 | abcde  | abcdefghijklmn |     236.12 |     236.12 |      236 |
|     1 | 10000 | abcde  | abcdefghijklmn |     236.12 |     236.12 |      236 |
+-------+-------+--------+----------------+------------+------------+----------+
2 rows in set (0.00 sec)

2. VARCHAR(N)

Varchar类型可以用来存可变字长的字符串,是最常见的数据类型。varchar在存储和检索时候,会保留末尾的空格。char作为定长存储,会用空格补齐剩下的空间方便检索和比较,但是查询出的char(N)的末尾是不存在空格的。varchar比定长的数据类型更节省空间,因为他只使用需要的空间,越短的字符串占用的空间越少(意思是即使把一个字段声明为varchar(100),但是你存入了’hello’,这时候存储的时候只在磁盘上占用了5个字符需要的空间11bytes);varchar需要使用额外的一个或者两个字节记录字符串的长度。也就是说在存储较短的字符串时候,这两个声明方式在磁盘空间占用上不存在差异

但是在内存空间的使用上存在差异,因为mysql会分配固定的内存来保存内部值,尤其是使用内存临时表进行排序或操作时,会特别糟糕。

所以最好的策略是只分配需要的空间。

N代表字宽,占用的存储空间。

3. 对于带有小数部分的实数类型:decimal

decimal用于存储精确类型的小数,比如财务数据。对于decimal列可以指定小数点前后所允许的最大位数。这会影响到空间的消耗。Mysql5.1和更好的版本将数字打包保存到一个二进制字符串中(每四个字节存储9个数字),例如decimal(18,9),,允许小数点两边各存储9位数字。这个字段一共使用了9个字节,小数点前后的9位数字各使用4个字节,小数点本身占用一个字节。

可以考虑bigInt代替decimal,实现精确计算(避免浮点存储不精确,decimal精确计算代价高)。比如财务数据需要精确到百分之一,把小数乘100转换成bigint,从而实现精确计算。

可以看到,当我们插入超出decimal(m,n)的数据时候,小数超出范围的数据被舍弃了并没存储到数据库中,整数超限不能插入。

参考资料:
1. 高性能Mysql
2. http://www.360doc.com/content/14/0704/16/11253639_391990569.shtml
3. https://stackoverflow.com/questions/1151667/what-are-the-optimum-varchar-sizes-for-mysql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值