先來解釋下什麼是錯誤緩衝區?
在mysql裡面,錯誤緩衝區只記錄最近一次出現的錯誤,只要是有新的錯誤產生,舊的就會被覆蓋掉。所以想知道產生了什麼錯誤,就得在每個有可能發生錯誤的語句後面緊跟著"show warnings" 或者 "show errors"。 最簡單的方法是把輸出的結果重定向到自己定義的日誌檔案裡面,這樣就可以方便後續檢視。當然如果想隨時檢視這些錯誤,我們就得通過mysql提供的api來實現。
自從mysql 5.6 這個革命性的版本出現後,問題得到了初步解決。雖然離我們想的還差好多。
mysql 5.6 提供了 get diagnostic 語句來獲取錯誤緩衝區的內容,然後把這些內容輸出到不同範圍域的變數裡,以便我們後續靈活操作。
下來,我們就來看乙個例子。
針對的表結構為:
create table `t_datetime` (
`id` int(11) not null,
`log_time` timestamp not null default current_timestamp on update current_timestamp,
`end_time` datetime not null,
primary key (`id`)
) engine=innodb default charset=utf8
儲存過程**為:
delimiter $$
use `new_t`$$
drop procedure if exists `sp_do_update`$$
createdefiner=`root`@`localhost` procedure `sp_do_update`(
in f_id int,
in f_log_time varchar(255),
in f_end_time varchar(255)
)begin
declare i_con1 tinyint default 0;
declare i_code char(5) default '00000';
declare i_msg text;
declare i_rows int;
declare i_con1 condition for 1048; -- 這個錯誤**代表字段限制不能null。
declare continue handler for i_con1
begin
set i_con1 = 1;
get diagnostics condition 1
i_code = returned_sqlstate, i_msg = message_text;
end;
update t_datetime
set log_time = ifnull(f_log_time,null),
end_time = ifnull(f_end_time,null)
where id = f_id;
if i_con1 = 0 then
get diagnostics i_rows = row_count;
set @i_result = concat("update succeeded, affected ", i_rows,'.');
else
set @i_result = concat('update failed, error code is 1042, related message is ',i_msg,'.');
end if;
select @i_result;
end$$
delimiter ;
我們來執行上面的儲存過程,完了後,就能把錯誤資訊儲存到session 變數@i_result 中。這樣,方便了後期進行各種輸出。
call sp_do_update(1,now(),date_add(now(),interval 1 day));
result.
update succeeded, affected 1.
call sp_do_update(1,null,null);
result.
update failed, error code is 1042, related message is column 'log_time' cannot be null.
***********************************=分割線******************************==
mysql 緩衝區 mysql 執行緒級別的緩衝區
執行緒棧資訊使用記憶體 thread stack 主要用來存放每乙個執行緒自身的標識資訊,如執行緒id,執行緒執行時基本資訊等等,我們可以通過 thread stack 引數來設定為每乙個執行緒棧分配多大的記憶體。排序使用記憶體 sort buffer size mysql 用此記憶體區域進行排序操...
scanf,getchar讀取字元和緩衝區
首先我們來看這樣一段 include intmain printf 請輸入密碼 scanf s password printf 請確認密碼 y n int ch getchar if ch y else 是不是有些同學會認為輸完密碼後,再輸入y就會列印出確認成功呢,但實際上卻並是這樣 可以看到程式並...
mysql 快取區 MYSQL緩衝區和快取設定
mysql緩衝區和快取設定 mysql 支援超過 100 個的可調節設定 但是幸運的是,掌握少數幾個就可以滿足大部分需要。查詢這些設定的正確值可以通過 show status 命令檢視狀態變數,從中可以確定 mysqld 的運作情況是否符合我們的預期。給緩衝區和快取分配的記憶體不能超過系統中的現有記...