表12.20信息功能
的名字 | 描述 |
---|---|
基准() |
反复执行表达式 |
字符集() |
返回参数的字符集 |
胁迫() |
返回字符串参数的核对胁迫性值 |
整理() |
返回字符串参数的排序 |
CONNECTION_ID () |
返回连接的连接ID(线程ID) |
CURRENT_USER () 那当前用户 |
经过身份验证的用户名和主机名 |
数据库() |
返回默认(当前)数据库名称 |
found_rows() |
对于带有LIMIT子句的SELECT,如果没有LIMIT子句,将返回的行数 |
last_insert_id() |
上一个插入的AutoIncrement列的值 |
row_count() |
更新的行数 |
架构() |
数据库的同义词() |
session_user() |
用户()的同义词 |
system_user() |
用户()的同义词 |
用户() |
客户端提供的用户名和主机名 |
版本() |
返回指示MySQL Server版本的字符串 |
这
基准()
函数执行表达式expr.
反复数数
时代。它可能用于时间mysql处理表达式的快速。结果值是0.
,或空值
对于不适当的论据,如a空值
或负重复计数。预期用途来自内部mysql客户端,报告查询执行时间:
mysql>选择基准(1000000,Aes_encrypt('hello','goodbye'));+ ------------------------------------------- + |基准(1000000,Aes_encrypt('hello','goodbye'))|+ ------------------------------------------- + |0 |+ ------------------------------------------- + 1排集(4.74秒)
报告的时间在客户端上经过时间,而不是服务器端的CPU时间。建议执行
基准()
多次,并根据服务器机器的负载有多重来解释结果。基准()
旨在测量标量表达式的运行时性能,这对您使用它的方式具有一些重大影响并解释结果:只能使用标量表达式。尽管表达式可以是一个子查询,但它必须返回单个列,最多返回单个行。例如,
基准测试(10,(SELECT * FROM t))
如果表格失败T.
有多个列或多行。执行一个
选择
声明expr.
N
时间不同于执行选择基准(
就所涉及的开销量而言。这两个具有非常不同的执行配置文件,您不应该指望他们采取相同的时间。前者涉及解析器,优化器,表锁定和运行时评估N
那expr.
)N
每个人。后者只涉及运行时评估N
乘以,所有其他分量只有一次。已经分配的内存结构可以被重用,并且运行时优化(比如对已经为聚合函数评估的结果进行本地缓存)可以改变结果。使用基准()
因此,通过赋予该组件更多的权重并删除“噪音“由网络,解析器,优化器等引入。
返回字符串参数的字符集。
mysql>选择charset('abc');- >'latin1'yysql> select charset(转换('abc'使用utf8));- >'utf8'mysql> select charset(user());- >'utf8'
返回字符串参数的核对胁迫值。
mysql> SELECT强制性('abc' COLLATE latin1_swedish_ci);-> 0 mysql> SELECT mandatory (USER());-> 3 mysql> SELECT mandatory ('abc');-> 4 mysql> SELECT mandatory (1000);- > 5
返回值的含义如下表所示。值越低优先级越高。
胁迫 意义 例子 0.
显式整理 价值 整理
条款1
没有整理 具有不同排列的字符串的串联 2
隐式整理 列值、存储的例程参数或局部变量 3.
系统常数 用户()
返回值4.
胁迫 字符串 5.
数字 数值或时间值 5.
无知 空值
或来自的表达空值
有关更多信息,请参阅第10.8.4节“表达中的融合胁迫”。
返回字符串参数的排序规则。
mysql >选择排序(' abc ');-> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc');——>“utf8_general_ci”
返回连接的连接ID(线程ID)。每个连接都有一个ID,它在当前连接的客户端中是唯一的。
返回的价值
CONNECTION_ID ()
与显示的值是相同的值ID
列的INFORMATION_SCHEMA。PROCESSLIST
表,桌子ID
列的显示PROCESSLIST
产出,和PROCESSLIST_ID
性能模式的列线程
桌子。mysql> select connection_id();- > 23786.
警告改变会话值
pseudo_thread_id.
系统变量会更改返回的值CONNECTION_ID ()
功能。返回服务器用于验证当前客户端的MySQL帐户的用户名和主机名组合。此帐户决定您的访问权限。对象中的字符串返回值
UTF8.
字符集。的价值
CURRENT_USER ()
能与价值不同吗用户()
。mysql >选择用户();-> 'davida@localhost' mysql> SELECT * FROM mysql.user;ERROR 1044: Access denied for user " @'localhost' to database 'mysql' > SELECT CURRENT_USER();——>“@localhost”
这个例子说明了尽管客户端指定了用户名
达瓦达
(如此值所示用户()
函数),服务器使用匿名用户帐户对客户端进行身份验证(如空的用户名部分所示CURRENT_USER ()
值)。可能发生这种情况的一种方式是,在授予表中没有列出帐户达瓦达
。在存储的程序或视图中,
CURRENT_USER ()
返回定义对象的用户的帐户(由其给出定义
值),除非使用SQL安全调用程序
的特点。在后一种情况下,CURRENT_USER ()
返回对象的调用。触发器和事件没有选择定义
SQL安全
对这些物体来说,CURRENT_USER ()
返回定义该对象的用户的帐户。要返回调用程序,请使用用户()
或者session_user()
。以下陈述支持使用
CURRENT_USER ()
函数代替受影响用户或定义者的名称(可能还包括主机名称);在这种情况下,CURRENT_USER ()
扩展在何处,根据需要:关于信息的影响,这一扩展
CURRENT_USER ()
有复制,见第16.4.1.8节,“CURRENT_USER()的复制”。将默认(当前)数据库名称返回为字符串
UTF8.
字符集。如果没有默认数据库,数据库()
回报空值
。在存储的例程中,默认数据库是例程与之关联的数据库,这不一定与调用上下文中默认的数据库相同。mysql >选择数据库();——>“测试”
如果没有默认数据库,
数据库()
回报空值
。一种
选择
声明可能包括一个限制
子句要限制服务器返回到客户端的行数。在某些情况下,希望知道陈述的陈述数量有多少行限制
,但不再运行该声明。要获取此行计数,请包括一个sql_calc_found_rows.
选项在选择
声明,然后调用found_rows()
之后:mysql>选择sql_calc_found_rows *tbl_name.-> WHERE id > 100 LIMIT 10;mysql >选择FOUND_ROWS ();
第二
选择
返回一个数字,该数字指示第一行有多少行选择
如果不是写的限制
条款。在没有的情况下
sql_calc_found_rows.
最近成功的选项选择
声明中,found_rows()
返回该语句返回的结果集中的行数。如果声明包括一个限制
条款,found_rows()
返回在限制范围内的行数。例如,found_rows()
如果语句包括,则分别返回10或60限制10.
或者限制50,10
。可用的行数
found_rows()
是瞬态的,并且不打算在选择SQL_CALC_FOUND_ROWS
声明。如果以后需要引用该值,保存它:SELECT SQL_CALC_FOUND_ROWS * FROM…;mysql> SET @rows = FOUND_ROWS();
如果您正在使用
选择SQL_CALC_FOUND_ROWS
,MySQL必须计算完整结果集中的数量。但是,这比再次运行查询更快限制
,因为结果集不需要发送到客户端。sql_calc_found_rows.
和found_rows()
当您希望限制查询返回的行数,但又希望在不再次运行查询的情况下确定完整结果集中的行数时,可能非常有用。一个例子是一个Web脚本,它显示一个页面显示,其中包含指向显示搜索结果其他部分的页面的链接。使用found_rows()
使您能够确定剩下的结果还需要多少其他页面。指某东西的用途
sql_calc_found_rows.
和found_rows()
更复杂联盟
语句比简单选择
陈述,因为限制
可能发生在一个联盟
。它可以适用于个人选择
陈述在联盟
,或全球联盟
结果整体。意图
sql_calc_found_rows.
为了联盟
如果没有全局,它应该返回将返回的行计数限制
。使用的条件sql_calc_found_rows.
和联盟
是:的价值
found_rows()
只有当UNION ALL
使用。如果联盟
没有全部
使用,发生重复删除和值found_rows()
只是近似。
除了这里描述的例子,行为
found_rows()
未定义(例如,它的值跟随选择
用错误失败的声明)。重要的found_rows()
不使用基于语句的复制可靠地复制。使用基于行的复制自动复制此函数。last_insert_id()
那last_insert_id(
expr.
)没有理由,
last_insert_id()
返回A.长整型数字无符号
(64位)值,表示成功插入的第一个自动生成的值自动递增
列作为最近执行的结果插入
声明。的价值last_insert_id()
如果没有成功插入行,则保持不变。有一个争论,
last_insert_id()
返回一个无符号整数。例如,在插入生成
自动递增
值,您可以获得这样的价值:mysql>选择last_insert_id();- > 195.
当前执行的语句不会影响
last_insert_id()
。假设您生成自动递增
有一个语句的价值,然后参考last_insert_id()
在一个多行中插入
语句将行插入到表中自动递增
柱子。的价值last_insert_id()
在第二个语句中保持稳定;它对于第二行和以后的行的值不受前面的行插入的影响。(但是,如果你混合引用last_insert_id()
和last_insert_id(
,效果是未定义的。)expr.
)如果前面的语句返回错误,则
last_insert_id()
是未定义的。对于事务表,如果由于错误而退回语句,则值last_insert_id()
留下未定义。对于手动回滚
, 的价值last_insert_id()
未恢复到事务之前的状态;它仍然是在回滚
。在存储的例程(过程或函数)或触发器的主体内,值
last_insert_id()
更改的方式与在这类对象体之外执行的for语句相同。存储例程或触发器对值的影响last_insert_id()
下面的语句取决于例程的类型:如果存储过程执行更改值的语句
last_insert_id()
,通过遵循过程调用的语句来看更改的值。对于更改值的存储函数和触发器,当函数或触发结束时,恢复该值,因此遵循它们的语句不会看到更改的值。
生成的ID在服务器上维护为基础。这意味着函数返回给给定客户端的值是第一个
自动递增
为大多数最近的陈述生成的值自动递增
柱子由那个客户。即使它们生成,其他客户端也不能受到其他客户的影响自动递增
他们自己的价值观。此行为可确保每个客户端都可以检索自己的ID,而不担心其他客户端的活动,而无需锁定或事务。的价值
last_insert_id()
如果设置了,则不会改变自动递增
行的列到非“魔法“值(也就是说,一个不是的值空值
并不是0.
)。重要的如果使用单行插入多行
插入
声明中,last_insert_id()
返回为此生成的值第一个插入行只有。原因是为了使其可以轻松再现插入
对其他服务器的陈述。例如:
MySQL>使用测试;MySQL>创建表T(ID int auto_increment not null主键,name varchar(10)不是null);mysql>插入t值(null,'bob');mysql>从t中选择*;+ ---- + ------ + |ID |名称|+ ---- + ------ + |1 |鲍勃| +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ mysql> INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql> SELECT * FROM t; +----+------+ | id | name | +----+------+ | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +----+------+ mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 2 | +------------------+
虽然是第二个
插入
语句将三个新行插入T.
,为其中第一行生成的ID为2
,它是返回的这个值last_insert_id()
为以下选择
声明。如果你使用
插入忽略
行被忽略了,last_insert_id()
与当前值保持不变(如果连接尚未成功执行,则返回0插入
),对于非事务性表,使用自动递增
计数器不是递增的。为了InnoDB
桌子,桌子自动递增
计数器递增,如果innodb_autoinc_lock_mode
被设置为1
或者2
,如下例所示:MySQL>使用测试;mysql> select @@ innodb_autoinc_lock_mode;+ -------------------------- + |@@ innodb_autoinc_lock_mode |+ -------------------------- + |1 |+ ---------------------------- + mysql>创建表`t`(`id` int(11)不是null auto_increment,`val` int(11)默认空键,主键(`id`),唯一键`i1`(`val`))引擎= innodb默认charset =拉丁文1;#插入两行MySQL>插入To(Val)值(1),(2);#与auto_increment_offset = 1,插入的行#导致auto_increment值为3 mysql> show create表t \ g ***************************** 1.行***************************表:t创建表:创建表`t`(`id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 # LAST_INSERT_ID() returns the first automatically generated # value that is successfully inserted for the AUTO_INCREMENT column mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+ # The attempted insertion of duplicate rows fail but errors are ignored mysql> INSERT IGNORE INTO t (val) VALUES (1),(2); Query OK, 0 rows affected (0.00 sec) Records: 2 Duplicates: 2 Warnings: 0 # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter # is incremented for the ignored rows mysql> SHOW CREATE TABLE t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful mysql> SELECT LAST_INSERT_ID(); +------------------+ | LAST_INSERT_ID() | +------------------+ | 1 | +------------------+
有关更多信息,请参阅第14.6.1.6节“Innodb中的Auto_Increment处理”。
如果
expr.
被称为争论last_insert_id()
,参数的值由函数返回,并作为下一个要返回的值被记住last_insert_id()
。这可用于模拟序列:创建一个表来保存序列计数器并初始化它:
mysql> CREATE TABLE sequence (id INT NOT NULL);mysql> INSERT INTO sequence VALUES (0);
使用这个表来生成序号,如下所示:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);mysql>选择last_insert_id();
这
更新
语句递增序列计数器并导致下一次调用last_insert_id()
返回更新值。这选择
声明检索该价值。这mysql_insert_id ()
C API函数也可用于获得该值。看mysql_insert_id ()。
您可以在不调用的情况下生成序列
last_insert_id()
但是,使用这种功能的效用是这样的方式,就是在服务器中维护ID值作为最后一个自动生成的值。它是多用户安全的,因为多个客户端可以发出更新
语句获取自己的序列值选择
语句(或mysql_insert_id ()
),而不会影响或被其他生成自己序列值的客户端所影响。请注意,
mysql_insert_id ()
只在插入
和更新
语句,因此您无法使用C API函数来检索值last_insert_id(
执行其他SQL语句之后expr.
)选择
或者放
。row_count()
返回值如下:为了
更新
语句中,默认情况下,受影响的行数是实际更改的行数。如果您指定了client_found_rows.
旗帜mysql_real_connect ()
当连接到mysqld.,受影响的行数为行数“发现“;也就是说,匹配在哪里
条款。为了
取代
语句,受影响的行数为2,如果新行替换了旧行,因为在这种情况下,删除重复后插入一行。为了
插入...在重复的密钥更新时
语句,每行受影响的行值为1如果行被插入为新行,则2如果更新现有行,则为0如果现有行将其设置为其当前值。如果您指定了client_found_rows.
标志,如果现有行设置为其当前值,则受影响的行值为1(不是0)。这
row_count()
的值类似于mysql_affected_rows()
C API函数和行的计数说明mysql客户端显示以下语句执行。mysql> INSERT INTO t VALUES(1),(2),(3);查询OK, 3行影响(0.00 sec)记录:3重复:0警告:0 mysql> SELECT ROW_COUNT();+-------------+ | ROW_COUNT () | +-------------+ | 3 | +-------------+ 1行集(0.00秒)mysql >删除从t,我在(1、2);查询OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT();+-------------+ | ROW_COUNT () | +-------------+ | 2 | +-------------+ 1行集(0.00秒)
重要的row_count()
不使用基于语句的复制可靠地复制。使用基于行的复制自动复制此函数。此功能是一个同义词
数据库()
。session_user()
是一个同义词用户()
。system_user()
是一个同义词用户()
。将当前MySQL用户名和主机名返回为字符串
UTF8.
字符集。mysql >选择用户();- >'Davida @ localhost'
该值表示连接到服务器时指定的用户名,以及连接的客户端主机。取值可以与“of”不同
CURRENT_USER ()
。返回一个表示MySQL服务器版本的字符串。字符串使用
UTF8.
字符集。除了版本号之外,该值可能具有后缀。查看描述的描述版本
系统变量in.第5.1.7节“服务器系统变量”。。这个函数对于基于语句的复制是不安全的。如果在以下情况下使用此功能,将记录警告
binlog_format
被设置为陈述
。mysql >选择版本();——>“5.7.35-standard”