威尼斯人线上娱乐网 1

def cut(self, bit):
    str_sli = str(self).split('.', 1)
    sli = len(str_sli[0]) + bit + 1
    result = str(self)[:sli]
    return result

a = cut(3.1356, 2)
print(a)    #输出结果为: 3.13

MySQL知识树-扶植的数据类型,mysql数据类型

本篇学习笔记的机要内容:

介绍MySQL帮忙的各个数据类型(常用),并主讲其关键特征。

 

MySQL帮忙两种数据类型,首要包罗数值类型、日期和时间项目、字符串类型。

 

数值类型

MySQL的数值类型包涵整数类型、浮点数类型、定点数类型、位类型。

 

卡尺头档期的顺序

MySQL帮忙的整数类型有tinyint、smallint、mediumint、int、bigint(范围从小到大)。

 

zerofill

大家在概念整数类型时能够在项目名称前面包车型客车小括号内钦点显示上涨的幅度,例如int(5),当插入的数值宽度小于5位时,MySQL会在数值后面填充宽度。对于int类型倘使不手动钦赐宽度,则默感觉int(11)。

体现升幅相似是特别zerofill来行使,即当插入的数值位数未完结钦命的显示上涨的幅度时,缺少三个人就能在数值前填充多少个0

图1

威尼斯人线上娱乐网 2

图1,我们创造表t_1,七个字段分别为id1和id2,都是int类型。此中id2我们内定了展现升幅为5,而id1未有手动内定展现升幅,由此它的显得升幅会取暗中同意值11。

 

图2

威尼斯人线上娱乐网 3

图2,大家向表中插入一条数据后再将其查询出来,固然今后id1和id2查询出来的数值都是1,但鉴于id1在概念时不曾点名显示上升的幅度,因而在插入数值1后,其前面拾二人都被填充了小幅度。而id2由于内定了体现上升的幅度,因而其前方唯有4位被填充宽度。

 

图3

威尼斯人线上娱乐网 4

图4

威尼斯人线上娱乐网 5

图3、图4,为了更直观的阅览填充宽度的机能,大家将id1和id2的概念稍作修改,使用zerofill来填充宽度。

 

图5

威尼斯人线上娱乐网 6

图5,在运用了zerofill后,大家能够看来数值前边被0填充宽度的功能。那么大家在进展查询时利用1或00001充作条件得以拿走结果吧?

 

图6

威尼斯人线上娱乐网 7

图6,能够看看在行使1或00001当做查询条件时,能意识到id2对应的数值。但此处要注意的是在MySQL中其实存款和储蓄的值仍然为1,并不是00001,因为00001实际不是意气风发种整数的表现方式,而是后生可畏种字符串的表现情势,上边包车型地铁图7将评释这几个主题素材。

 

图7

威尼斯人线上娱乐网 8

图7,我们在询问时利用了hex()函数作为相比,能够看看选取hex()函数获得的值是1,假如hex()获得的值是3030303031(字符串1的16进制为31,字符串0的16进制为30),则足以无庸置疑在MySQL中是以00001的字符串情势举行仓库储存的,但很醒目这里实际不是。

 

注:hex()函数能够将多少个数字或字符串调换为十六进制格式的字符串

 

对此钦赐显示上涨的幅度的做法,联想到叁个标题,在id2定义为int(5)的图景下,若是插入超过呈现上涨的幅度的值,会怎么着呢?

 

图8

威尼斯人线上娱乐网 9

图8,向id2插入长度为6位的数值111111时,MySQL未有报任何错误也从没将111111截断。因而申明了展示上涨的幅度并不会对插入的数值长度发生限制,两者并从未什么样关联,除非插入的数值超越了数据类型的限量,见图9。

 

图9

 威尼斯人线上娱乐网 10

图9,可以看到固然插入成功但MySQL有二个告诫(当MySQL的SQL
Mode为严酷情势时,该插入行为将不可以预知被成功,同期MySQL会报E途观RO本田CR-V),大家在将数据查询出来时能够看看MySQL对原来插入的多寡开展了截取,保留值为4294967295。

 

威尼斯人线上娱乐网,注:int数据类型有暗号的最小值为-2147483648,最大值为2147483647,无符号的最小值为0,最大值为4294967295

 

知识点表达:

实在对于展现上涨的幅度来说,唯有同盟使用了zerofill,彰显上升的幅度才有含义,否则就让呈现上升的幅度为默许值就能够了。不要感到内定显示上涨的幅度会对整数类型的取值范围有哪些影响,两个之间没有另外涉及,而提及整数类型的取值范围独有unsigned才会对其发出震慑。

 

 

unsigned

当我们在概念整数类型时使用了zerofill,MySQL会为我们机关对该列再增多unsigned(图3、图4对列增添了zerofill后,再查看表的DDL
[数据库定义语句],会发觉列多了unsigned,详见图10)。那是因为当使用了zerofill后,插入该列的值就不恐怕为负数了,因此活动增添unsigned也是理所应当的,同时unsigned也会增加整数类型最大值的取值范围。

 

图10

威尼斯人线上娱乐网 11

 

 

auto_increment

平头门类还可能有叁个性质便是auto_澳门威斯尼斯全部网址,increment,並且以此性情依然大背头类型特有的。auto_increment的成效便是使列值保持自动增加,auto_increment的值暗中同意从1开首,也足以手动设置其开始值。对被设置为auto_increment的列插入null值时,实际插入的值是该列当前最大值加1(null并不会影响到棉被服装置为auto_increment列的多寡插入,列会寻常的张开机动拉长)。

当三个列棉被服装置为auto_increment时,日常还亟需为该列设置not null和primary
key(主键,一般被安装为auto_increment的列会作为主键使用,这里只是说平日,也可能有非主键的事态)。

别的索要提醒的是一张表中最四只好有三个字段被设置为auto_increment。

 

 

浮点数和定点数

那二者都以用来表示小数的,浮点数富含float(单精度)、double(双精度),定点数仅为decimal。两个在概念时都能够钦命其精度和标度,精度是指黄金年代共彰显多少位数字(整数位+小数位),标度是指正确到小数点后有一点点位,表现情势如:decimal(15,2),这里的精度是15个人(整数十六位,小数2位),标度是2位。

亟待证实的是定点数在MySQL内部是以字符串的款型来保存的,属于纯粹存储,但展现出来的是小数,它比浮点数更确切。

 

图11

威尼斯人线上娱乐网 12

图12

威尼斯人线上娱乐网 13

图13

威尼斯人线上娱乐网 14

图11,大家创制一张表,字段id的数据类型为decimal(5,2),如图12在向表里插入当先标度的值时,尽管插入成功但是插入时的数码却被截断了,这里发出了四舍五入。

图13大家向表里尝试插入抢先精度的值,难道也会发生截断并四舍五入?多个值会分别展现为123.12和124.12吗?从结果来看通晓不是,大家的嫌疑是一心错误的。在超过精度的景况下,即便插入成功但插入的值却是内定精度和标度下的最大值,举例(5,2)下的最大值为999.99。

如日中天经在SQL
Mode严酷方式下,上述这么些插入操作将不可能被实行成功且MySQL会报E锐界RO传祺。

 

外加知识点:

单精度和双精度的分化,那二者的分别可别通晓为单精度是正确到小数点后一人,而双精度是标准到小数点后两位,这明显是不对的。实际上由于float的有效位数是7位,double的有效位数是13个人,由此单精度、双精度其实是代表这里的有效位数。

除此以外部供给要注意的是有效位数并不等于正确位数,尽管float能够表示到小数点后7位,但独有前6位是可相信的,第7位很恐怕引致数据误差。而对此double来讲独有前十三人是准确的,第15人也很恐怕导致数据抽样误差。

 

外加知识点:

有关float、double精度错过的难题,实际上就是被扩展或截断了,究其缘由是因为存取时标度不平等所导致的。在录入数据时若数据的标度与定义列数据类型时设置的标度不均等,则会导致存入时以近乎的值来积存,那就招致了我们地点提及的精度错过。

这在什么样状态下float、double的精度不会废弃呢?其实根据上面出标题标意况,大家得以想到当数码标度与连串标度同样时(录入数据的标度与定义列数据类型时设置的标度后生可畏致),就不会发出精度错失。

鉴于此,大家常采纳decimal类型,小于等于其标度的多寡都能被正确录入,不会发出精度错失,因为其是将数据以字符串的款式来存进数据库的,那就保障了正确性。但并非说decimal就不会时有爆发精度错过,纵然它不会发生精度扩张但却会发生精度截断。比如当录入数据的标度大于列数据类型设置的标度时,依旧会发出四舍五入。

即使我们说decimal将数据以字符串的款式存入数据库,同不常候又会设有精度截断的难题(四舍五入),看似两个有文字描述上的冲突,其实不然。大家那样来驾驭:decimal将发生了四舍五入的多少以字符串的花样存入了数据库,但显示出来的是小数(二个是积攒情势,一个是表现情势),且那几个小数的精度不会再爆发变化,而随意是以什么样精度来获得那一个值,它都以四舍五入后以字符串方式存入时的值。

 

 

位类型

位类型指的正是BIT,它是用来存放二进制数据的,bit(1)表示存储长度为1位的二进制数据。

图14

威尼斯人线上娱乐网 15

图15

威尼斯人线上娱乐网 16

小编们对图14的表中插入超越位数的数码,从图15的第三个查询结果集中能够发掘数目发生了截断,数值2的二进制是10,3的二进制是11,它们的第二个人都被截断了。

在图15的首先个查询结果聚集,须要表明的是在MySQL命令行窗口中使用select *
from
t_bit_test是无能为力看到我们必要的数码的,你不得不看见有三个笑颜被呈现出来,那既然bit中贮存的是二进制数据,大家就采纳bin()函数以二进制的花样来展现它们。

 

———————未完待续———————

本篇学习笔记的主要性内容: 介绍 MySQL
帮衬的各类数据类型(常用),并主讲其关键特征。 MyS…

—————————————————————————-日期之差—————————

威尼斯人线上娱乐网 17

print(getcontext())
getcontext().prec = 50    # 设置全局精度
b = Decimal(1)/Decimal(3)
print(b)
c = Decimal(1)/Decimal(17)
print(float(c))

是 numeric_e-xpression 将在四舍五入的精度。length 必得是
tinyint、smallint 或int。当 length 为正数时,numeric_e-xpression
四舍五入为 length 所钦命的小数位数。当 length
为负数时,numeric_e-xpression 则按 length
所钦命的在小数点的侧面四舍五入。

参考: 

  使用前边三种办法开展管理,查看一下管理结果:

Select ROUND(123.45, -2)
100.00

 

五、截取小数点后bit位


威尼斯人线上娱乐网 18

明显前边三种格局是不适用的,round()内置函数其结果只可以取到小数点后十五位;而格式化管理即便可以取到叁11人,但其精度是不标准的。

参数
numeric_e-xpression

经过结果发掘,前面包车型客车5被截断,保留了两位有效小数。

print("1: %.30f" % (1/3))  # 输出:1: 0.333333333333333314829616256247
print("2: %s" % round((1/3), 30))  # 输出:2: 0.3333333333333333

上面是结果集:

威尼斯人线上娱乐网 19

编辑函数cut(self,bit)举办拍卖

Select ROUND(123.9994, 3), ROUND(123.9995, 3)
GO

其四个参数如果是0,则四舍五入,如果是非0,则截断

 

归来类型
返回与 numeric_e-xpression 一样的项目。

 

       
不取值,number的小数部分存在0.5的时候,round()取临近的偶数;

是要施行的操作类型。function 必得是 tinyint、smallint 或 int。假设轻易function 或 function 的值为 0(暗中认可),numeric_e-xpression
将四舍五入。当内定 0 以外的值时,将截断 numeric_e-xpression。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注