什么是错误缓冲堆栈呢? 举个很简单的例子,比如执行下面一条语句:
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的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
