Mysql向存儲過程中傳遞中文參數變成亂碼的解決方案


今天做程序需要用到一個存儲過程,然后用php程序調用。
  存儲過程如下:
delimiter $$
CREATE PROCEDURE disagree_upgrade_detail(a int,b text)
BEGIN
SET NAMES 'utf8';
UPDATE `upgrade_detail` SET `disagree_description`=b WHERE `id`=a;
INSERT INTO `disagree_upgrade_detail` SELECT * from `upgrade_detail` WHERE `id`=a;
DELETE FROM `upgrade_detail` WHERE `id`=a;
END;
$$
PHP的調用代碼片段如下:
mysql_query("CALL disagree_upgrade_detail({$which},'{$why}');");
后來在跑程序的時候發現一個問題。
由於$why這個變量的值是大部分情況存在中文,在傳遞給存儲過程后,變成了帶有?的亂碼。在此之后我檢查了php、數據庫的編碼已經統一,搞了很久還是一籌莫展。
最后我在http://topic.csdn.net/u/20070703/09/fbceeb45-1c8d-4009-ac84-cabe9fc315d7.html中找到了答案。對其進行了如下修改
delimiter $$
CREATE PROCEDURE disagree_upgrade_detail(a int,b Nvarchar(4000))
BEGIN
SET NAMES 'utf8';
UPDATE `upgrade_detail` SET `disagree_description`=b WHERE `id`=a;
INSERT INTO `disagree_upgrade_detail` SELECT * from `upgrade_detail` WHERE `id`=a;
DELETE FROM `upgrade_detail` WHERE `id`=a;
END;
$$
PHP的調用代碼片段如下:
mysql_query("CALL disagree_upgrade_detail({$which}, N'{$why}');");
需要注意的代碼已經標綠。在創建存儲過程的時候, 設計中文的參數的數據類型需為Nvarchar,而在傳遞參數的時候也需要多加一個N


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM