侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 292 篇文章
  • 累计创建 132 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

MySql系统信息函数的使用方式

孔子说JAVA
2022-09-15 / 0 评论 / 0 点赞 / 26 阅读 / 5,173 字 / 正在检测是否收录...

MySQL数据库中提供了很丰富的函数,这些函数可以帮助用户更加方便的处理表中的数据,他们会对传递进来的参数进行处理,并返回一个处理结果,也就是返回一个值。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。SELECT语句及其条件表达式都可以使用这些函数。同时,INSERT 、UPDATE、DELECT语句及其条件表达式也可以使用这些函数。本文主要讲解系统信息函数。

系统信息函数用来查询MySQL数据库的系统信息,当我们需要知道当前 MySQL 数据库的一些基本信息和使用情况的时候,可以使用系统信息函数来获取相关信息,以随时掌握数据库的使用情况。函数列表如下:

函数名称 作 用
version 返回数据库版本号
connection_id 返回服务器的连接数
database、schema 返回当前数据库名
user()、current_user、current_user()、system_user()、session_user() 返回当前用户
charset(s) 返回字符串 s 的字符集
collation(s) 返回字符串 s 排列方式
show processlist 显示当前用户的链接信息
last_insert_id 最后生成的自动递增的值

1、version 数据库版本号

查看当前 MySQL 数据库版本号。

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.29    |
+-----------+
1 row in set (0.00 sec)

2、connection_id 服务器的连接数

connection_id()返回mysql服务器当前连接的次数,每个连接都有各自唯一的id。

mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|              24 |
+-----------------+
1 row in set (0.00 sec)

3、database 当前数据库名

查看当前使用的数据库名。

mysql> select database(), schema();
+------------+----------+
| database() | schema() |
+------------+----------+
| test_db    | test_db  |
+------------+----------+
1 row in set (0.00 sec)

注意:如果之前没有使用语句 use 数据库名; 来确定数据库的使用,那么返回的结果为 null。

4、user 获取当前登录用户名称

user()、current_user、current_user()、system_user()、session_user() 都可以返回当前登录用户信息。返回的结果值显示了当前账户连接服务器时的用户名及连接的客户主机,规则为:当前登录的用户名@当前登录的主机。

mysql> select user(), current_user, current_user(), system_user(), session_user();
+----------------+----------------+----------------+----------------+----------------+
| user()         | current_user   | current_user()  | system_user()  | session_user()  |
+----------------+----------------+----------------+----------------+----------------+
| root@localhost | root@localhost | root@localhost | root@localhost | root@localhost |
+----------------+----------------+----------------+----------------+----------------+
1 row in set (0.00 sec)

5、charset(str) 字符集函数

charset(str)返回字符串str自变量的字符集。

mysql> select charset('yunweijia') as roll, charset(convert('abc' using latin1)) as roll_1, charset(version()) as roll_2;
+---------+--------+---------+
| roll    | roll_1 | roll_2  |
+---------+--------+---------+
| utf8mb3 | latin1 | utf8mb3 |
+---------+--------+---------+
1 row in set (0.00 sec)

6、collation(str) 字符排列方式函数

collation(str)返回字符串str的字符排列方式。

mysql> select collation('abc') as coll, collation(convert('abc' using latin1)) as coll_1;
+-----------------+-------------------+
| coll            | coll_1            |
+-----------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-----------------+-------------------+
1 row in set (0.00 sec)

7、show processlist 获取mysql运行线程

show processlist显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态,可以借此排查出有问题的sql语句等。

  1. 如果是root账户,能看到所有用户的当前连接。其他用户只能看到自己的。
  2. show processlist只能列出100条,如果想看全部的话可以使用show full processlist命令。
mysql> show processlist;
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
| Id | User            | Host            | db      | Command | Time   | State                  | Info             |
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
|  5 | event_scheduler | localhost       | NULL    | Daemon  | 946721 | Waiting on empty queue | NULL             |
| 24 | root            | localhost:58414 | test_db | Query   |      0 | init                   | show processlist |
+----+-----------------+-----------------+---------+---------+--------+------------------------+------------------+
2 rows in set (0.01 sec)

使用show processlist命令查出的结果各个字段的含义:

  • ID:用户登录mysql时,系统分配的是coeenction id;
  • User:显示 当前用户;
  • Host:显示这个语句使用哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户;
  • db:显示这个进程目前连接的是哪个数据库;
  • Command:显示当前连接执行的命令,一般取值为休眠(sleep)、查询(query)、连接(connect);
  • Time:显示这个状态持续的时间,单位是秒;
  • State:显示使用当前连接的sql语句的状态。state只是语句执行中的某一个状态。一个sql语句,以查询为例,可能需要经过copying to tmp table、sorting result、sending date等状态才可以完成;
  • Info:显示这个sql语句,是判断问题语句的一个重要依据。

8、last_insert_id 获取最后生成的自动递增值的函数

last_insert_id()函数获取最后一个自动生成的ID值的函数。

  1. 首先创建一个表并插入几条数据;
mysql> create table test_1 (id int auto_increment not null primary key, name varchar(100));
Query OK, 0 rows affected (0.05 sec)

mysql> insert into test_1 values(null, 'zhangsan'), (null, 'lisi'), (null, 'wangwu');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

查看下表中数据;

mysql> select * from test_1;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | lisi     |
|  3 | wangwu   |
+----+----------+
3 rows in set (0.00 sec)
  1. 使用last_insert_id()查看最后自动生成的id值;
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

可以看到最后生成的id值为1,为什么会是1,而不是3呢?我们继续插入数据看一下。

  1. 再次插入数据;
mysql> insert into test_1 values (null, 'yunwei');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_1 values (null, 'yunweijia');
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_1 values (null, '0909');
Query OK, 1 row affected (0.01 sec)

查看下表中数据;

mysql> select * from test_1;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | zhangsan  |
|  2 | lisi      |
|  3 | wangwu    |
|  4 | yunwei    |
|  5 | yunweijia |
|  6 | 0909      |
+----+-----------+
6 rows in set (0.00 sec)
  1. 使用last_insert_id()查看最后自动生成的id值;
mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                6 |
+------------------+
1 row in set (0.00 sec)

可以看到最后生成的id值为6,是我们期待的结果。

原因分析如下:

  • 第一次插入的三条数据使用的是一条sql,使用last_insert_id()时只返回这条sql获取的第一个auto_increment的值,即虽然插入了3条数据,但是获取的仅仅是第一条数据插入时候的auto_increment的值,也就是1;

  • 后面的结果为什么返回6?这是因为后来插入的三条数据是分别插入的,所以说每次获取的都是属于他自己的auto_increment,故而返回了6。

小提示:

  • last_insert_id是和数据表无关的,如果向表test_1插入数据后再向表test_2插入数据,那么last_insert_id返回表test_2中的auto_increment的值。
0

评论区