本节将介绍常用的系统信息函数。MySQL中的系统信息有数据库的版本号、当前用户名和连接数、系统字符集、最后一个自动生成的ID值等。
VERSION()返回表示MySQL服务器版本的字符串,这个字符串使用utf8字符集。
【例4.89】查看当前MySQL版本号,输入语句如下:
mysql> SELECT VERSION(); +--------------+ | VERSION() | +--------------+ | 8.0.2 | +--------------+
CONNECTION_ID()返回MySQL服务器当前连接的次数,每个连接都有各自唯一的ID。
【例4.90】查看当前用户的连接数,输入语句如下:
mysql> SELECT CONNECTION_ID(); +--------------------------+ | CONNECTION_ID() | +--------------------------+ | 23 | +--------------------------+
这里返回23,返回值根据登录的次数会有所不同。
SHOW PROCESSLIST; SHOW FULL PROCESSLIST;
processlist命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态、帮助识别出有问题的查询语句等。
如果是root账号,能看到所有用户的当前连接;如果是其他普通账号,则只能看到自己占用的连接。show processlist只列出前100条,如果想全部列出,可使用show full processlist命令。
【例4.91】使用SHOW PROCESSLIST命令输出当前用户的连接信息,输入语句如下:
MySQL> SHOW PROCESSLIST; +--+---------------+---------------+-----+-------+------+----------------------+----------------+ |Id|User | Host | db |Command| Time |State | Info | +--+---------------+---------------+-----+-------+------+----------------------+----------------+ |4 |event_scheduler|localhost |NULL |Daemon |15274 |Waiting on empty queue|NULL | |23|root |localhost:58788|NULL |Query | 0 |starting |SHOW PROCESSLIST| +--+---------------+---------------+-----+-------+------+----------------------+----------------+
各个列的含义和用途:
(1)Id列,用户登录MySQL时,系统分配的是“connection id”。
(2)User列,显示当前用户。如果不是root,这个命令就只显示用户权限范围内的SQL语句。
(3)Host列,显示这个语句是从哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户。
(4)db列,显示这个进程目前连接的是哪个数据库。
(5)Command列,显示当前连接执行的命令,一般取值为休眠(Sleep)、查询(Query)、连接(Connect)。
(6)Time列,显示这个状态持续的时间,单位是秒。
(7)State列,显示使用当前连接的SQL语句的状态,很重要的列。后续会有所有状态的描述,State只是语句执行中的某一个状态。一个SQL语句,以查询为例,可能需要经过Copying to tmp table、Sorting result、Sending data等状态才可以完成。
(8)Info列,显示这个SQL语句,是判断问题语句的一个重要依据。
打开另一个命令行窗口登录MySQL,此时将会有2个连接,在第2个登录界面的命令行下再次输入SHOW PROCESSLIST,结果如下:
mysql> SHOW PROCESSLIST; +----+------+--------------+--------+---------+--------+---------+----------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+--------------+--------+---------+--------+---------+----------------+ | 1 | root |localhost:3602|NULL | Sleep | 38 | | NULL | | 2 | root |localhost:3272|NULL | Query | 0 |NULL |show processlist| +----+------+--------------+--------+---------+--------+---------+----------------+
可以看到,当前活动用户登录的连接Id为2,正在执行的Command(操作命令)是Query(查询),使用的查询命令为SHOW PROCESSLIST;而连接Id为1的用户目前没有对数据进行操作,即处于Sleep操作,而且已经过了38s。
DATABASE()和SCHEMA()函数返回使用utf8字符集的默认(当前)数据库名。
【例4.92】查看当前使用的数据库,输入语句如下:
mysql> SELECT DATABASE(),SCHEMA(); +----------------+----------------+ | DATABASE() | SCHEMA() | +----------------+----------------+ | test_db | test_db | +----------------+----------------+
可以看到,两个函数的作用相同。
USER()、CURRENT_USER()、CURRENT_USER()、SYSTEM_USER()和SESSION_USER()这几个函数返回当前被MySQL服务器验证的用户名和主机名组合。这个值符合确定当前登录用户存取权限的MySQL账户。一般情况下,这几个函数的返回值是相同的。
【例4.93】获取当前登录用户名称,输入语句如下:
mysql> SELECT USER(), CURRENT_USER(), SYSTEM_USER(); +----------------+----------------+----------------+ | USER() | CURRENT_USER() | SYSTEM_USER() | +----------------+----------------+----------------+ | root@localhost | root@localhost | root@localhost | +----------------+----------------+----------------+
返回结果值表明了当前账户连接服务器时的用户名及所连接的客户主机,root为当前登录的用户名,localhost为登录的主机名。
CHARSET(str)返回字符串str自变量的字符集。
【例4.94】使用CHARSET()函数返回字符串使用的字符集,输入语句如下:
mysql> SELECT CHARSET('abc'), CHARSET(CONVERT('abc' USING latin1)), CHARSET(VERSION()); +--------------+------------------------------------+-------------------+ |CHARSET('abc')|CHARSET(CONVERT('abc' USING latin1))| CHARSET(VERSION())| +--------------+------------------------------------+-------------------+ | utf8mb4 | latin1 | utf8mb3 | +--------------+------------------------------------+-------------------+
CHARSET('abc')返回系统默认的字符集utf8mb4;CHARSET(CONVERT('abc' USING latin1))返回的字符集为latin1;前面介绍过,VERSION()返回的字符串使用utf8字符集,因此CHARSET返回结果为utf8mb3。
COLLATION(str)返回字符串str的字符排列方式。
【例4.95】使用COLLATION()函数返回字符串的排列方式,输入语句如下:
mysql> SELECT COLLATION('abc'),COLLATION(CONVERT('abc' USING utf8)); +-------------------+--------------------------------------+ | COLLATION('abc') | COLLATION(CONVERT('abc' USING utf8)) | +-------------------+--------------------------------------+ | utf8mb4_0900_ai_ci| utf8_general_ci | +-------------------+--------------------------------------+
可以看到,使用不同字符集时字符串的排列方式不同。
LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值。
【例4.96】使用SELECT LAST_INSERT_ID查看最后一个自动生成的列值。
(1)一次插入一条记录
首先创建表worker,其Id字段带有AUTO_INCREMENT约束,输入语句如下:
mysql> CREATE TABLE worker(Id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, Name VARCHAR(30));
分别单独向表worker中插入两条记录:
mysql> INSERT INTO worker VALUES(NULL, 'jimy'); mysql> INSERT INTO worker VALUES(NULL, 'Tom'); mysql> SELECT * FROM worker; +----+------+ | Id | Name | +----+------+ | 1 | jimy | | 2 | Tom | +----+------+
查看已经插入的数据可以发现,最后一条插入的记录的Id字段值为2,使用LAST_INSERT_ID()查看最后自动生成的Id值:
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+
可以看到,一次插入一条记录时,返回值为最后一条插入记录的Id值。
(2)一次同时插入多条记录
接下来,向表中插入多条记录,输入语句如下:
mysql> INSERT INTO worker VALUES (NULL, 'Kevin'),(NULL,'Michal'),(NULL,'Nick');
查询已经插入的记录:
mysql> SELECT * FROM worker; +----+--------+ | Id | Name | +----+--------+ | 1 | jimy | | 2 | Tom | | 3 | Kevin | | 4 | Michal | | 5 | Nick | +----+--------+
可以看到最后一条记录的Id字段值为5,使用LAST_INSERT_ID()查看最后自动生成的Id值:
mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 3 | +------------------+
结果显示,LAST_INSERT_ID值不是5而是3,这是为什么呢?在向数据表中插入一条新记录时,LAST_INSERT_ID()返回带有AUTO_INCREMENT约束的字段最新生成的值2;继续向表中同时添加3条记录,读者可能以为这时LAST_INSERT_ID值为5,可显示结果却为3,这是因为当使用一条INSERT语句插入多行时,LAST_INSERT_ID()只返回插入的第一行数据时产生的值,在这里为第3条记录。之所以这样,是因为这使依靠其他服务器复制同样的 INSERT语句变得简单。
提示: LAST_INSERT_ID是与数据表无关的,如果向表a插入数据后再向表b插入数据,那么LAST_INSERT_ID返回表b中的Id值。