控制mysql数字转换
在实际工作中我们常常需要将数字进行格式化,比如将12.0073233变为12.01,或把12变为12.00,或把12变为0000012,这种格式之间的转换总结如下:
一,浮点数的转换——直接设置数据库中的字段信息
mysql提供了两个数据类型:numeric和decimal(可以近似的认为二都无区别),这两种数据类型可以轻松解决上面的问题:
NUMERIC 和 DECIMAL 类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例 如:salary DECIMAL(5,2)在这个例子中,5 (精度(precision)) 代表重要的十进制数字的数目,2 (数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary 列可以存储的值范围是从 -99.99 到 99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到 999.99,因为它没有存储正数的符号)。M 与D 对DECIMAL(M, D) 取值范围有影响(当超过范围时mysql会自动处理,这会导致数据不准确),所以在建表时要考虑的所存数据的大小范围。
在建表时直接指定字段信息,或建表之好更新字段信息:
创建表:create table test_number(a numeric(10,2), b DECIMAL(10,2))engine myisam charset utf8;
插入数据:insert into test_number values (12.06722,13.223343);
查找数据:select * from test_number;
结果如下:
可以看出,数据在数据库中已按要求的格式进行存储。
查看创建表过程:show create table test_number;
结果如下:
说明在Mysql内部,全部都是以decimal的方式建表的,所以可以说numeric和decimal是相同的
二,浮点数的转换——对查询数据格式化
1、format
可以通过mysql的FORMAT(X,D)就可以控制数据X的小数点为D位了
创建表:create table test_number2 (a float)engine myisam charset utf8;
插入数据:insert into test_number2 values ( 12.06722);
一般查询:select * from test_number2;
查询位数比原插入时多:select format(a,10) from test_number2;
查询位数比原插入时少:select format(a,2) from test_number2;
可以看出,以这种方式可以实现查询数据的格式化,但是仍是有问题
format的问题
测试 SELECT FORMAT(12562.6655,2);
结果:12,562.67
查看文档:Formats the number X to a format like '#,###,###.##', rounded to D decimal places, and returns the result as a string. If D is 0, the result has no decimal point or fractional part.意思是整数部分超过三位的时候以逗号分割,并且返回的结果是string类型的。他会四舍五入的方式,但是得到的结果是string类型,不再是数字类型。
没有达到预期结果,想要的结果不要以逗号分隔,
2、truncate
select truncate(4545.1366,2);
结果:4545.13,直接截取不四舍五入,还是有问题。
3、 convert
select convert(4545.1366,decimal(10,2);
结果:4545.14,得到的结果仍是数据,所以在对数据查询格式化时应采用这种方法
select convert(a,decimal) from test_number2;
select convert(a,decimal(10,2)) from test_number2;
三、整数的转换——直接设置数据库中的字段信息
语法示例:
create table stu ( stu_id int(5) unsigned zerofill not null default 0 primary key,class_id int(5))。
四,整数数的转换——对查询数据格式化
select lpad(stu_id,10,'0') lpad(class_id,10,'0') from stu;
select lpad(stu_id,10,0), lpad(class_id,10,0) from stu;