10bet网址
MySQL 5.7参考手册
相关文件10bet官方网站 下载本手册 本手册摘录

12.16信息功能

表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.

    基准()函数执行表达式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时间不同于执行选择基准(Nexpr.就所涉及的开销量而言。这两个具有非常不同的执行配置文件,您不应该指望他们采取相同的时间。前者涉及解析器,优化器,表锁定和运行时评估N每个人。后者只涉及运行时评估N乘以,所有其他分量只有一次。已经分配的内存结构可以被重用,并且运行时优化(比如对已经为聚合函数评估的结果进行本地缓存)可以改变结果。使用基准()因此,通过赋予该组件更多的权重并删除噪音由网络,解析器,优化器等引入。

  • charset(str

    返回字符串参数的字符集。

    mysql>选择charset('abc');- >'latin1'yysql> select charset(转换('abc'使用utf8));- >'utf8'mysql> select charset(user());- >'utf8'
  • 胁迫(str

    返回字符串参数的核对胁迫值。

    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节“表达中的融合胁迫”

  • 排序(str

    返回字符串参数的排序规则。

    mysql >选择排序(' abc ');-> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc');——>“utf8_general_ci”
  • CONNECTION_ID ()

    返回连接的连接ID(线程ID)。每个连接都有一个ID,它在当前连接的客户端中是唯一的。

    返回的价值CONNECTION_ID ()与显示的值是相同的值ID列的INFORMATION_SCHEMA。PROCESSLIST表,桌子ID列的显示PROCESSLIST产出,和PROCESSLIST_ID性能模式的列线程桌子。

    mysql> select connection_id();- > 23786.
    警告

    改变会话值pseudo_thread_id.系统变量会更改返回的值CONNECTION_ID ()功能。

  • 当前用户CURRENT_USER ()

    返回服务器用于验证当前客户端的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 >选择数据库();——>“测试”

    如果没有默认数据库,数据库()回报空值

  • found_rows()

    一种选择声明可能包括一个限制子句要限制服务器返回到客户端的行数。在某些情况下,希望知道陈述的陈述数量有多少行限制,但不再运行该声明。要获取此行计数,请包括一个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()未定义(例如,它的值跟随选择用错误失败的声明)。

    重要的

    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()。这可用于模拟序列:

    1. 创建一个表来保存序列计数器并初始化它:

      mysql> CREATE TABLE sequence (id INT NOT NULL);mysql> INSERT INTO sequence VALUES (0);
    2. 使用这个表来生成序号,如下所示:

      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(expr.执行其他SQL语句之后选择或者

  • row_count()

    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()

    session_user()是一个同义词用户()

  • system_user()

    system_user()是一个同义词用户()

  • 用户()

    将当前MySQL用户名和主机名返回为字符串UTF8.字符集。

    mysql >选择用户();- >'Davida @ localhost'

    该值表示连接到服务器时指定的用户名,以及连接的客户端主机。取值可以与“of”不同CURRENT_USER ()

  • 版本()

    返回一个表示MySQL服务器版本的字符串。字符串使用UTF8.字符集。除了版本号之外,该值可能具有后缀。查看描述的描述版本系统变量in.第5.1.7节“服务器系统变量”。

    这个函数对于基于语句的复制是不安全的。如果在以下情况下使用此功能,将记录警告binlog_format被设置为陈述

    mysql >选择版本();——>“5.7.35-standard”