什么是错误缓冲堆栈呢? 举个很简单的例子,比如执行下面一条语句:
mysql>INSERTINTOt_datetimeVALUES(2,'4','5'); ERROR1292(22007):Incorrectdatetimevalue:'4'forcolumn'log_time'atrow1
上面1292这个代码指示的错误信息保存在哪里呢? 就保存在错误缓冲堆栈, 在MySQL里面叫 DIAGNOSTICS AREA。 关于这个概念,一直在MySQL5.7才得到确定的更新。
在MySQL5.5之前,想要得到这块区域的数据,就只能通过C的API来获取,从SQL层面是无法检索到的。MySQL5.5 先推出了这个概念。
在MySQL5.6发布后,不但可以检索这块区域,而且还可以重新封装,得到我们想要的数据。但是这块区域依然是只能保存一次错误代码,很容易被重置。
在MySQL5.7发布后,可以更加容易的检索这块区域,而且把这里的数据放到一个STACK里,重置的条件更加宽松。以下举例子来说明。
示例表结构如下,
CREATETABLE`t_datetime`( `id`int(11)NOTNULL, `log_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, `end_time`datetimeNOTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8;
用来记录错误数据的日志表。
CREATETABLEtb_log(errornoint,errortextTEXT,error_timestampDATETIME);
在MySQL5.6环境下,我要这样写一段繁杂的代码来获取错误信息。
DELIMITER$$ USE`new_feature`$$ DROPPROCEDUREIFEXISTS`sp_do_insert`$$ CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_do_insert`( INf_idINT, INf_log_timeVARCHAR(255), INf_end_timeVARCHAR(255) ) BEGIN DECLAREdone1TINYINTDEFAULT0;--保存是否发生异常的布尔值。 DECLAREiTINYINTDEFAULT1; DECLAREv_errcountINTDEFAULT0;--获取一次错误数据条数 DECLAREv_errnoINTDEFAULT0;--获取错误代码 DECLAREv_msgTEXT;--获取错误详细信息 DECLARECONTINUEHANDLERFORSQLEXCEPTION--定义一个异常处理块 BEGIN SETdone1=1;--发生异常,设置为1. getdiagnosticsv_errcount=number; SETv_msg=''; WHILEi<=v_errcount DO GETDIAGNOSTICSCONDITIONi v_errno=MYSQL_ERRNO,v_msg=MESSAGE_TEXT; SET@stmt=CONCAT('select',v_errno,',"',v_msg,'","',NOW(),'"into@errno',i,',@msg',i,',@log_timestamp',i,';'); PREPAREs1FROM@stmt; EXECUTEs1; SETi=i+1; ENDWHILE; DROPPREPAREs1; END; INSERTINTOt_datetime(id,log_time,end_time)VALUES(f_id,f_log_time,f_end_time); IFdone1=1THEN--把错误数据记录到表tb_log里。 SETi=1; WHILEi<=v_errcount DO SET@stmt=CONCAT('insertintotb_log'); SET@stmt=CONCAT(@stmt,'select@errno',i,',@msg',i,',@log_timestamp'); PREPAREs1FROM@stmt; EXECUTEs1; SETi=i+1; ENDWHILE; DROPPREPAREs1; ENDIF; END$$ DELIMITER;
MySQL5.7发布后,现在可以精简我的代码了。
DELIMITER$$ USE`new_feature`$$ DROPPROCEDUREIFEXISTS`sp_do_insert`$$ CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_do_insert`( INf_idINT, INf_log_timeVARCHAR(255), INf_end_timeVARCHAR(255) ) BEGIN DECLAREiTINYINTDEFAULT1; DECLAREv_errcountINTDEFAULT0;--获取一次错误数据条数 DECLAREv_errnoINTDEFAULT0;--获取错误代码 DECLAREv_msgTEXT;--获取错误详细信息 DECLARECONTINUEHANDLERFORSQLEXCEPTION--定义一个异常处理块 BEGIN getstackeddiagnosticsv_errcount=number; WHILEi<=v_errcount DO GETstackedDIAGNOSTICSCONDITIONi--把错误数据分别保存在变量里 v_errno=MYSQL_ERRNO,v_msg=MESSAGE_TEXT; INSERTINTOtb_logVALUES(v_errno,v_msg,NOW()); SETi=i+1; ENDWHILE; END; INSERTINTOt_datetime(id,log_time,end_time)VALUES(f_id,f_log_time,f_end_time); END$$ DELIMITER;
现在来执行下:
mysql>callsp_do_insert(2,'4','5'); QueryOK,1rowaffected(0.01sec)
来检索表tb_log的数据。
mysql>select*fromtb_log\G ***************************1.row*************************** errorno:1265 errortext:Datatruncatedforcolumn'log_time'atrow1 error_timestamp:2015-11-1711:53:10 ***************************2.row*************************** errorno:1265 errortext:Datatruncatedforcolumn'end_time'atrow1 error_timestamp:2015-11-1711:53:10 ***************************3.row*************************** errorno:1062 errortext:Duplicateentry'2'forkey'PRIMARY' error_timestamp:2015-11-1711:53:10 3rowsinset(0.00sec)
总结下, 如果先用到DIAGNOSTICS AREA, 最好是在存储过程里面写代码封装SQL。
以上就是【原创】mysql 错误缓冲堆栈_MySQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック



