MySQL中数据类型的长度问题总结
MySQL中数据类型的长度问题总结
⼤家好,我⼜回来了,这两个星期忙着做项⽬实训作业,没更博客。
放寒假了,先预祝⼤家狗年⼤吉!
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)
1. insert 1
2.12=>12.1200 因为⼩数点后未满4位,补0。
2. insert 12.12345=>12.1235 ⼩数点只留4位,多余的⾃动四舍五⼊截断
3. insert 1234567.12=> 失败,因为⼩数点未满4位,补0变成1234567.1200,超过了9位。严格模式下报错,⾮严格模式存成
999999.999。
4. 若插⼊的值未指定⼩数部分或者⼩数部分不⾜D位则会⾃动补到D位⼩数,若插⼊的值⼩数部分超过了D为则会发⽣截断,截取前D位
⼩数。M值得是整数部分加⼩数部分的总长度,也即插⼊的数字整数部分不能超过M-D位,否则不能成功插⼊,会报超出范围的错误。
5. 可能失误操作,感兴趣请⾃⼰尝试验证结果
OJBK了,请⼤家看完了留⾔评论,不好的⼀定指出,给我分享您的经验,我万分感谢。
“真实,正义,⽆畏,同情。”

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。