天天看点

mysql还有哪些自带的函数呢?别到处找了,看这个就够了。

 格式化函数FPRMAT(x,n)

​format(x,n)​

​​将数字​

​x​

​​进行格式化,并以四舍五入的方式保留小数点后​

​n​

​位,结果以字符串的形式返回。

如果​

​n​

​为0,则返回结果函数不含小数部分。

mysql> select format(999.12345678, 5), format(888.12345678, 0);
+-------------------------+-------------------------+
| format(999.12345678, 5) | format(888.12345678, 0) |
+-------------------------+-------------------------+
| 999.12346               | 888                     |
+-------------------------+-------------------------+
1 row in set (0.00 sec)

mysql>      

不同进制的数字之间进行相互转换

​conv(n, from_base, to_base)​

​这个函数可以进行不同进制数之间的相互转换。比如将16进制的数字转换成2进制,亦或者将2进制的数字转换成10进制都可以。

返回值为数值​

​n​

​​的字符串表示,由​

​from_base​

​​进制转化为​

​to_base​

​​进制。如果任意一个参数为​

​null​

​​的话,那么返回值就是​

​null​

​。

mysql> select conv('a', 16, 10) as coll, conv(123, 10, 2) as coll_1, conv(123, 10, 16) as coll_2, conv(123, 10, 8) as coll_3;
+------+---------+--------+--------+
| coll | coll_1  | coll_2 | coll_3 |
+------+---------+--------+--------+
| 10   | 1111011 | 7B     | 173    |
+------+---------+--------+--------+
1 row in set (0.00 sec)

mysql>      

IP地址和数字相互转换的函数

​inet_auto(expr)​

​​给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或者8​

​bit​

​地址。

mysql> select inet_aton('192.168.1.1');
+--------------------------+
| inet_aton('192.168.1.1') |
+--------------------------+
|               3232235777 |
+--------------------------+
1 row in set (0.00 sec)

mysql>      

反之,我们也可以使用​

​inet_ntoa​

​函数将数值网络地址转换为字符串网络点地址,往下看:

mysql> select inet_ntoa(3232235777);
+-----------------------+
| inet_ntoa(3232235777) |
+-----------------------+
| 192.168.1.1           |
+-----------------------+
1 row in set (0.00 sec)

mysql>      

所以,从上面来看,​

​inet_ntoa​

​​和​

​inet_aton​

​互为反函数。

加锁函数和解锁函数

​get_lock(str, timeout)​

​​设法使用字符串​

​str​

​​给定的名字得到一个锁,超时时间为​

​timeout​

​​秒。如果成功得到了锁的话,则返回为1,如果操作超时的话,则返回为0;一旦发生错误,则返回​

​null​

​。

​release_lock(str)​

​​解开被​

​get_lock()​

​​获取的、用字符串​

​str​

​​锁命名的锁。如果锁被解开了,则返回为1,如果该线程尚未创建锁,则返回0(此时锁没有被解开);如果命名的锁不存在,则返回​

​null​

​​。如果这个锁从未被​

​get_lock()​

​的调用获取,或锁已经被提前解开,则该锁不存在。

​is_free_lock(str)​

​​检查名字为​

​str​

​​的锁是否可以使用,如果这个锁可以使用,则返回1(没有人使用这个锁);如果这个锁正在被使用,则返回0;出现错误的话,则返回​

​null​

​(像不正确的参数)。

​if_used_lock(str)​

​​检查名字为​

​str​

​​的锁是否正在被使用,如果这个封了锁,则返回使用该锁的客户端的连接标识符,否则的话,就返回​

​null​

​。

mysql> select get_lock('yunweijia', 15) as getlock, is_used_lock('yunweijia') as isusedlock, is_free_lock('yunweijia') as isfreelock, release_lock('yunweijia') as releaselock;
+---------+------------+------------+-------------+
| getlock | isusedlock | isfreelock | releaselock |
+---------+------------+------------+-------------+
|       1 |          8 |          0 |           1 |
+---------+------------+------------+-------------+
1 row in set (0.01 sec)

mysql>      

​get_lock('yunweijia', 15)​

​:返回结果为1,说明成功得到了一个名称为‘yunweijia’的锁,持续时间为15秒;

​is_used_lock('yunweijia')​

​​:返回结果为当前连接​

​id​

​​,表示名称为​

​yunweijia​

​的锁正在被使用;

​is_free_lock('yunweijia')​

​​:返回结果是0,说明名称为​

​yunweijia​

​的锁正在被使用;

​release_lock('yunweijia')​

​:返回值为1,说明解锁成功了。

重置执行指定操作的函数

​benchmark(count, expr)​

​​函数重复​

​count​

​​次数执行表达式​

​expr​

​。

他可以用机计算​

​mysql​

​​处理表达式的速度。结果值一般是0(0只是表示处理过程很快,并不是没有花费时间)。另外一个作用是它可以在​

​mysql​

​客户端内部报告语句执行的时间。

举个例子:

首先我们使用​

​sha​

​函数加密一个密码,如下:

mysql> select sha('yunweijia');
+------------------------------------------+
| sha('yunweijia')                         |
+------------------------------------------+
| 683501978a90d76d420b893cd7e00c8efde8e8f3 |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>      

可以从上面看到,这条​

​sql​

​​执行时间为​

​0.00 sec​

​​,然后我们再使用​

​benchmark​

​函数,重复执行这个命令50000次,再看下运行时间;

mysql> select benchmark(50000, sha('yunweijia'));
+------------------------------------+
| benchmark(50000, sha('yunweijia')) |
+------------------------------------+
|                                  0 |
+------------------------------------+
1 row in set (0.03 sec)

mysql>      

从上面结果可以看到,实际上运行了0.03秒。

改变字符集的函数

​convert(...using...)​

​​:带有​

​using​

​​的​

​convert()​

​函数被用来在不同的字符集之间转化数据。

mysql> select charset('yunweijia') as coll, charset(convert('yunweijia' using latin1)) as coll_1;
+---------+--------+
| coll    | coll_1 |
+---------+--------+
| utf8mb3 | latin1 |
+---------+--------+
1 row in set (0.00 sec)

mysql>      

从上面看到,默认的字符集为​

​utf8mb3​

​​,通过​

​convert​

​​将字符串​

​yunweijia​

​​的默认字符集改为​

​latin1​

​。

改变数据类型的函数

​cast(x, as type)​

​​和​

​convert(x, type)​

​​函数将一个类型的值转换为另一个类型的值,可转换的​

​type​

​有以下几种:

  • binary
  • char(n)
  • date
  • time
  • datetime
  • decimal
  • signed
  • unsigned
mysql> select cast(1000 as char(3)), convert('2022-07-18 09:09:00', time);
+-----------------------+--------------------------------------+
| cast(1000 as char(3)) | convert('2022-07-18 09:09:00', time) |
+-----------------------+--------------------------------------+
| 100                   | 09:09:00                             |
+-----------------------+--------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql>      

从上面可以看到,​

​select cast(1000 as char(3))​

​将整数数据1000,转换为带有两个显示宽度的字符串类型,结果为100;

​convert('2022-07-18 09:09:00', time)​

​​将​

​datetime​

​​类型的值转换为​

​time​

​​类型值,结果是​

​09:09:00​

​。

至此,本文结束。 

更多内容请转至VX公众号 “运维家” ,获取最新文章。

------ “运维家”  ------

------ “运维家”  ------

------ “运维家”  ------

临武县运维工程师培训,温州运维工程师,通达oa实施运维工程师,呼叫中心运维工程师面试