mysql函数之数值运算
2013-07-22 15:29:09 阿炯

本站赞助商链接,请多关照。 ABS(X):返回x的绝对值
mysql> select abs(-0.5),abs(0.5);
0.5,0.5

CEIL(X):返回大于x的最小整数
mysql> select ceil(-0.5),ceil(0.5);
0,1

FLOOR(X):返回小于X的最大整数,和CEIL相反
mysql> select floor(-0.5),floor(0.5);
-1,0

RAND()-随机值函数:返回0--1 之间的数值,不重复!
mysql> select rand(),rand();
0.0417027427271965,0.495627631894897

利用ceil 和rand 可以产生指定范围内的随机数
mysql> select ceil(100*rand()),ceil(100*rand());
36,28

ROUND(X,Y):返回x的四舍五入的有y位 小数的值
mysql> select round(1.25),round(1.25,1),round(1.25,2);
1,1.3,1.25

TRUNCATE(X,Y):返回数字x截断为y位小数的结果
与round的区别在于它仅是截断,而不于四舍五入。
mysql> select round(1.345,2),truncate(1.345,2);
1.35,1.34

MOD(X,Y):返回x%y的模


IP地址的类型转换

Ip地址实际上是32位无符号整数,不是字符串。用小数点将地址分成四段的表示方法只是为了让人们阅读容易,所以应该用无符号整数存储IP地址。数据库或编程语言中提供INET_ATON()和INET_NTOA()函数在这两种表示方法之间转换。

来看看MySQL官方文档中是怎么说的, 简单翻译一下:
INET_ATON (expr)
Given the dotted-quad representation of an IPv4 network address as a string, returns an integer that represents the numeric value of the address in network byte order (big endian). INET_ATON() returns NULL if it does not understand its argument.

传入点分四段形式的IPv4地址字符串,返回一个网络字节序(大端序)的整数地址值。 如果INET_ATON()解析失败则返回NULL。
> SELECT INET_ATON('10.0.5.9');
-> 167773449

上面例子中, 返回值的计算方式是: 10×2563 + 0×2562 + 5×256 + 9.

使用IP地址的缩写形式(例如'127.1'表示'127.0.0.1')时,INET_ATON()可能会也可能不会返回一个非NULL值。因此,INET_ATON()不应该用于这种地址的解析。

注意:要存储INET_ATON生成的IP地址,要使用INT UNSIGNED而不是INT(也就是应该使用无符号的INT),如果使用有符号的INT表示IP地址,那么第一个字节的值大于127时就不能正确存储了。

INET_NTOA (expr)
Given a numeric IPv4 network address in network byte order, returns the dotted-quad string representation of the address as a string in the connection character set. INET_NTOA() returns NULL if it does not understand its argument.

以网络字节序传入一个数值型IPv4地址,以链接的字符集返回字符点分四段形式的地址,解析失败返回NULL
> SELECT INET_NTOA(167773449);
-> '10.0.5.9'

IPv4地址的长度为32位(4字节),可被写作任何表示一个32位整数值的形式,但为了方便人类阅读和分析,它通常被写作点分十进制(Dot-decimal notation)的形式,即四个字节被分开用十进制写出,中间用点分隔。

格式    值        从点分十进制转换
点分十进制    192.0.2.235    不适用
点分十六进制    0xC0.0x00.0x02.0xEB    每个字节被单独转换为十六进制
点分八进制    0300.0000.0002.0353    每个字节被单独转换为八进制
十六进制    0xC00002EB    将点分十六进制连在一起
十进制    3221226219    用十进制写出的32位整数
八进制    030000001353    用八进制写出的32位整数


IPv6的转换可以查看MySQL的文档,都有详细的说明。