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工具。