您的位置:首页 > 数据库 > MySQL

MySQL中数据类型的长度问题总结

2018-01-28 16:59 537 查看

MySQL中数据类型的长度问题总结

大家好,我又回来了,这两个星期忙着做项目实训作业,没更博客。

放寒假了,先预祝大家狗年大吉!

在初次接触Mysql的时候,虽然会用,但是只是照着老师或者跟着视频敲来实现功能,并没有什么自己思考的意思,结果导致会用,但是说不出来的所以然。我简单总结了几个常用的数据类型长度的问题:

1):int类型,对吧,经常像保存个时间戳啊、id啊、数量啊、排序啊都会用到

提问:INT(11)是什么意思?最大保存十一位数么?

回答:不是楞个回事,听我给你摆,首先长度,也就是INT(M),M指示最大显示宽度,不是说限制你只能插入规定长度的数据,如果不信你试一下:INT(1),你可以插数字1,也可以插100,1000。那到底是撒子意思耶?MySQL手册上头说的清清楚楚:

M指示最大显示宽度,最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关

好,这下晓得的撒?我们指定的INT(10)、INT(11)是指定显示宽度,不是存储大小或者值的范围,再看一个例子:

INT(3)的情况下 插入数字20,和数字2以及数字200,显示结果为:

020;

002;

200;

MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(3))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

说白了就是你设定最大宽度,插入的数据不够大,就从填充0,给你填满,够大就随便你,不得管你。这下就很通透了撒,哈哈~(但是强烈建议合理分配,过大过小都不好)

Tip: 对于int类型的,如果不需要存取负值,最好加上UNSIGNED;对于经常出现在WHERE语句中的字段,考虑加索引,整形尤其适合加索引。

2):VARCHAR和CHAR 类型,先VARCHAR,经常用的比如用户名之类可变长度,那就说用户名吧

提问:你说这个用户名,VARCHAR(20)是撒子意思噢?(当然自己把握,没说必须20),这是规定长度了吧?用没得限制哦?汉字英文都是一样的迈?

回答:对头,就是可变长度,你阔以叫渣渣辉,也阔以叫乌木喂喂威 恩耶吞温威 乌温穆扁 欧萨斯,20个字符以内都阔以



说到是不是中英文都一样20个字符,在MySQL5.0之后:是的,一样。但在低版本中,英文肯定还是20,但中文要diao一点,一个占三个字节,所以存不了20个汉字,最多就6,7个??

然后说CHAR,也就是固定长度了,比如密码,常见的MD5加密,就是CHAR(32)对吧,多了少了都不行。

他们俩的区别就是一个可变长度一个固定长度,长度的区别CHAR是0-255,VARCHAR最大长度不固定(64K?反正一般文本够用),存在像字符集不同会受影响之类的因素,感兴趣可以自己去查查,我……晓得撒(懒)。大文本可以考虑TEXT,都是字符串类型的,最大到4G。

然后想说的是

1. 如果知道文本的长度,最好直接用定长CHAR。

2. CHAR>VARCHAR>TEXT。(具体以存储引擎而定)

3. CHAR和VARCHAR可以有默认值,TEXT不能指定默认值。

4. 尽可能节约空间使用更短的列,分配真正需要的空间,10和100都能存“你好”,懂得起撒

最后是数值型中的DECIMAL数据类型,看到一段描述:

float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)

double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

因为在建表时,我价格字段就用的DECIMAL,之前用的float,

提问:为什么不用float?

回答:float,double等非标准类型,在数据库中保存的是近似值,而DECIMAL是以字符串的形式保存数值。打个比方,我存的是整数的时候,他就整数给我处理了,(举一反三??)我存0.00给我实际存个0,我存14.00实际给我存个14,是都可以存浮点数,但是涉及到钱,金额这方面还是给我精准着来。

DECIMAL(M,D)

a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。

b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

也就是说,M就是总长度,D就是小数点后面的长度。比如:

DECIMAL(5,4)=>总长度不超过5位数字,并且小数点后头必须要4位数字:1.2345

DECIMAL(14,9)=>总长度5位数字,整数5位,小数点后9位:12345.123456789

注意:

超出范围或者长度不够会被截断或补位

example:DECIMAL(9,4)

insert 12.12=>12.1200 因为小数点后未满4位,补0。

insert 12.12345=>12.1235 小数点只留4位,多余的自动四舍五入截断

insert 1234567.12=> 失败,因为小数点未满4位,补0变成1234567.1200,超过了9位。严格模式下报错,非严格模式存成999999.999。

若插入的值未指定小数部分或者小数部分不足D位则会自动补到D位小数,若插入的值小数部分超过了D为则会发生截断,截取前D位小数。M值得是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过M-D位,否则不能成功插入,会报超出范围的错误。

可能失误操作,感兴趣请自己尝试验证结果

OJBK了,请大家看完了留言评论,不好的一定指出,给我分享您的经验,我万分感谢。

“真实,正义,无畏,同情。”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 数据类型