中文亂碼無論在何時都是一個頭疼的問題,mysql的存儲過程參數也同樣存在這個問題。
1、直接使用insert into語句沒問題,能夠正常插入漢字。
2、把insert into語句移到Procedure中后,就無法插入漢字了。在客戶端軟件中插入的漢字總是為亂碼,英文和數字沒問題。
3、如果在jdbc中調用這個Procedure總是報錯:
在查閱了很多相關資料后,發現只需要改動procedure的參數的定義就OK了,改動為:在varchar參數后面加入: character set 指定編碼。由於服務器編碼為gbk,我指定為:
declare v_title varchar(200) character set gbk
再執行插入時就不會亂碼了
寫個完整的 存儲過程 供參考
create procedure copyDevTO_authKey()
begin
DECLARE var_userId int;
DECLARE var_authkey varchar(512) character set gbk;
DECLARE done INT DEFAULT 0;
DECLARE cur_device CURSOR FOR select userId,authkey from tbl_device;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SET done = 0;
OPEN cur_device;
-- loop cursor
FETCH cur_device INTO var_userId , var_authkey;
WHILE done <> 1 DO
insert into tbl_user_authkey values (var_userId , var_authkey);
FETCH cur_device INTO var_userId , var_authkey;
END WHILE;
CLOSE cur_device;
end
============================================================================
昨天下班前發現有個存儲過程有問題,無法正確的查詢數據。
數據表和字段都是 utf8 存儲的中文內容。在連接數據庫后也使用 SET NAMES utf8; 設置了編碼。但是在存儲過程中無法查詢中文內容的字段。由於一些邏輯處理的原因,存儲過程使用了游標,同時定義了一些局部變量。
CREATE PROCEDURE `PROC_FOOBAR`(id INTEGER)
BEGIN
DECLARE user_id VARCHAR(32) ;
– 省略代碼若干
END
user_id 在代碼中參與了一個 查詢 SELECT * FROM `table1` WHERE `UID` = user_id。
在存儲過程中輸出 user_id 發現英文內容正常,但是中文內容亂碼。
開始以為存儲過程的編碼有問題,但是不使用變量的內容又正常。上網查了一下,有人遇到同樣的問題:
但是顯然,他的問題只要正確設置編碼即可。
突然靈光一現,NND,character set 這個東西我忽略了。正解如下:
CREATE PROCEDURE `PROC_FOOBAR`(id INTEGER)
BEGIN
DECLARE code, user_id VARCHAR(32) CHARACTER SET utf8;
– 省略代碼若干
END