300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 关于MySQL数据类型定义的几个细节-INT(N)/VARCHAR(N)/DECIMAL(M N)

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

时间:2024-01-17 03:46:25

相关推荐

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

关于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. /content/14/0704/16/11253639_391990569.shtml

3. /questions/1151667/what-are-the-optimum-varchar-sizes-for-mysql

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。