《MySQL排错指南》——1.4 获取查询信息

1.4 获取查询信息

正如前一节看到的一样,数据库会返回一些关于每个查询的重要信息,有些信息直接展现在MySQL的访问客户端中,而有些信息则需要通过如SHOW WARNINGS等命令才能得到。当从应用程序中调用SQL语句的时候,获取这些返回信息并确认没有异常情况发生同样重要。所有语言的MySQL API都提供了获取服务器返回信息的接口。本节将讨论这些接口。这里仅涉及C的API,因为我必须选择一种语言的API,并且大部分其他语言的API都是基于C的API的[2]。

受影响的行数
我们从之前见过的输出开始,每次插入、更新或者删除后都会显示有多少行数据插入、更新或者删除了:

这个信息代表查询正常执行并且修改了N行数据。

要在应用程序中获取相同的信息,可以调用:

如果有改变发生,该函数会返回一个正数,如果没有改变那么返回0,−1代表反生错误。

对于UPDATE语句,如果客户端设置了CLIENT_FOUND_ROWS,那么该函数将会返回满足WHERE条件的行数,这个数并不总是和实际更改的行数一致。

提示 提示

对于Connector/J来说,默认不启用受影响的行,因为这不是JDBC兼容的特性并且会使其DML语句依赖于匹配的行数而不是受影响的行数的大多数应用程序产生错误。不过对于INSERT...ON DUPLICATE KEY UPDATE类型的语句会返回正确的更新数量。连接字符串属性useAffectedRows告诉Connector/J在连接到服务器的时候是否设置CLIENT_FOUND_ROWS标志。
匹配的行数
输出中表示该数目的字符串是:

该输出表明有多少行满足WHERE条件。

下面的C函数:

以字符串格式返回关于最近的查询的补充信息。

对于更新操作来说,它返回的字符串类似:

其中,每个#依次对应代表匹配的行数、修改的行数和警告数目。可以通过解析该行中的“matched: #”获悉有多少行被查找出来。

被修改的行数
输出中代表该数目的字符串是:

该输出表明有多少行实际上修改了。需要注意的是,匹配行数M和修改的行数P是可以不同的。例如,假设你想要修改的列已经包含你指定的值,在这种情况下,该列会被认为是匹配的而不是修改的。

在应用程序中,像之前一样用mysql_info()获取信息,不过这次是解析“Changed: #”。

警告:数目和消息
输出中表示这部分信息的字符串是:

如果服务器在处理请求过程中探查到一些不寻常的情况或者值得报告的情况,你将会获得警告。不过查询仍然会执行并且会修改数据。无论如何请确保检查警告信息,因为它们会帮助你获悉潜在的问题。

在应用程序中,有很多不同的方式去获取警告。仍可以使用mysql_info()函数,然后解析“Warinings: #”。也可以调用:

如果有警告,可以执行SHOW WARNINGS命令去获取关于究竟发生了什么的文本消息。另一个选择是:

该函数将返回最近的SQL状态(SQLSTATE)。例如,“42000”代表语法错误,“00000”代表没有错误和警告。

提示 提示

SQLSTATE的值由ANSI SQL标准定义,用于表明语句的执行状态。执行状态被设置成标准中定义的状态码,表明一个请求是成功完成还是返回异常。SQLSTATE以字符串形式返回。要了解MySQL服务器可能返回哪些状态码,可以阅读MySQL参数手册中的“服务器错误码和错误消息”一节。
错误
检查错误也总是很有用。下面的函数返回最近SQL语句的错误值。

  ..tu18-1.tif

该函数返回最近一次错误的MySQL错误代码。例如,语法错误会生成数字1064,0意味着没有错误。

该函数返回最近一次错误的文本信息。对于语法错误,它会返回类似以下的内容。

这有利于保存存储于不同日志文件中的信息,使你可以在任何时候检查它们。

提示 提示

MySQL官方文档包含MySQL服务器可能返回的错误列表以及客户端错误列表。
 
**
通过perror获取错误字符串**

perror工具是MySQL发行包中携带的一款用于解决问题的非常有用的工具。perror能够提供与给定错误代码相关联的MySQL及其所在操作系统的错误信息。可以从MySQL命令行客户端、信息函数或其他错误日志文件中的错误消息中后面括号的部分获取错误代码。下面是一些示例:

  

当命令产生错误的时候会在MySQL客户端输出这些错误代码,这些错误代码可以通过mysql_error()函数由程序获取。然而,当你面对一个错误码不知所措的时候,可以使用perror工具。

时间: 2024-09-20 00:05:58

《MySQL排错指南》——1.4 获取查询信息的相关文章

《MySQL排错指南》导读

前言 MySQL排错指南我从2006年5月开始,作为首席技术支持工程师在MySQL AB公司MySQL支持团队的bug校验组工作,然后我到了Sun公司,最后是在Oracle公司.在日常工作中,我经常遇到用户受困于某个问题而不知所措的情况.虽然有已经被证实可用的方法去定位并快速修复问题,但是用户往往很难从大量的信息中筛选出这些可用的信息.尽管有数以千百计的著名书籍.博文和网页都详细介绍了MySQL服务器方方面面的问题,但这正是我感觉困难的地方:这些信息都关注于如何让MySQL服务器正常地工作,而忽

《MySQL排错指南》——第1章 基础

第1章 基础 MySQL排错指南当解决疑难问题的时候,为了节约时间,你可以从最简单的情况开始,然后一步步从简入繁.在MySQL支持团队工作的时候,我每个月解决成百上千的问题.其中的大部分都是从零散的请求信息开始的,最终的解决方案可能也很基础,我们将会从一些示例中看到这点.不过有些时候,我们确实会遭遇很大的挑战.所以,我们应时刻牢记从最基础的开始. 典型的基础类问题不外乎执行一个查询但是返回非预期的结果.这类问题的表现形式可能是很明显的错误,也可能是在你明知有匹配记录的情况下却没有返回结果,或者其

《MySQL排错指南》——第4章 MySQL环境

第4章 MySQL环境 MySQL排错指南MySQL服务器在运行环境中不是孤立的.即使它运行在专用服务器环境中,你依然需要考虑硬件资源和操作系统限制.在共享环境中,MySQL服务器仍然会受到其他进程的影响.关于MySQL操作系统层面的调优,这个主题可以另写一本书了.所以本章不深入讨论,只是从排错角度切入并展开.MySQL的其中一个优势就是能运行在不同环境中,但这也导致了本章很难将其细化说明.最终我决定写下你需要关心的部分,剩下的留给你去查找操作系统对应的手册来决定如何调优.

Mysql中 show table status 获取表信息的方法_Mysql

使用方法 mysql>show table status; mysql>show table status like 'esf_seller_history'\G; mysql>show table status like 'esf_%'\G; 样例: mysql>show table status like 'esf_seller_history'\G; 1.Name 表名称 2.Engine: 表的存储引擎 3.Version: 版本 4.Row_format 行格式.对于My

《MySQL排错指南》——1.1 语法错误

1.1 语法错误 这个错误听起来十分简单,但仍可能很难发现.我建议你像处理其他问题一样,非常细心地查找可能出现的SQL语法错误. 类似如下错误,很容易被发现: 在这个示例中,很显然用户少转入了个"m",错误消息也很清楚(输出结果根据页面设置进行宽度调整): 遗憾的是,不是所有的语法错误都这么显而易见.我曾经处理过一个问题,它的查询语句是这样的: 这是一个版本迁移导致的问题:该语句在5.0版本中运行正常,但是在5.1版本中出现错误.问题的原因在于,在5.1版本中,"access

《MySQL排错指南》——1.9 许可问题

1.9 许可问题 MySQL有复杂的权限方案,这使得你可以精确地设置哪些用户和主机可以或不可以执行这个或那个操作.从5.5版本开始,MySQL也有了可插拔式的身份验证模式. 尽管它有很多优势,但是这个方案很复杂.例如,让user1@hostA.user2@hostA和user1@hostB不同会很容易混淆它们的权限.当用户名相同而主机名变化的时候更是如此. MySQL允许在对象和连接层面设置访问规则.可以限制某个用户对于特定的表.列等的访问权限. 用户通常会遇到两类权限问题: 应该有权限连接到服

《MySQL排错指南》——1.7 当服务器无响应的时候

1.7 当服务器无响应的时候 有时候,MySQL客户端会收到严重的错误消息"在请求中丢失与服务器的连接"或者"服务器已停止".尽管我希望你永远不会遇到这个错误,但是有所准备总是有好处的.由MySQL安装本身引起的这个问题主要有两个原因:服务器问题(最有可能是崩溃)或者滥用连接选项(通常是超时选项或者max_allowed_packet). 第3章将讨论连接相关的配置.第4章会讨论硬件问题和第三方软件相关的问题.这里简短地介绍一下如果遇到服务器崩溃该做些什么. 首先,

《MySQL排错指南》——1.3 当错误可能由之前的更新引起时

1.3 当错误可能由之前的更新引起时 如果SELECT查询返回了非预期的结果集,这并不总是意味着查询语句本身有错误,也有可能是因为你以为已经进行了插入.更新或者删除等操作,而事实上它们并未生效. 在你调查这种可能之前,你应该先完全仔细检查前一节讨论的SELECT语句编写错误的问题.在SELECT语句编写正确并且能够返回你想要的值的情况下,现在我开始调查由数据本身的问题导致错误的可能性.为了确认问题是由数据本身而非SELECT语句产生的,我尝试精简语句,使其变成某个独立表的简单查询.如果是小表,那

《MySQL排错指南》——1.2 SELECT返回错误结果

1.2 SELECT返回错误结果 这是用户反馈的另一个非常常见的问题,主要的现象有:用户看不到更新的结果.展示的顺序错误或者查询到了非预期的结果. 这个问题主要有两方面的原因:一方面是你的SELECT查询有误:另一方面是数据库中的数据和你想象的不同.我先介绍第一种情况. 在我规划本节示例的时候,我考虑要么使用真实的示例,要么使用我自己设计的小场景.真实的示例可能占用大量篇幅,但是我自己设计的示例可能对你没有什么帮助,因为没有人会写出那样的代码.因此,我选择使用典型的真实示例作为示例,只是大幅简化