Mysql向存储过程中传递中文参数变成乱码的解决方案

Posted 它山之石可以攻玉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Mysql向存储过程中传递中文参数变成乱码的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

执行存储过程为啥其中的中文变成了乱码.该怎么解决

解决jsp参数传递的中文乱码问题

JMeter使用CSV Data参数化,中文参数传递过程出现乱码问题解决

Mysql存储过程中文乱码问题

window.location.href="";跳转到servlet中,但在IE浏览器中传递的中文参数在servlet变成乱码???

Mysql存储过程中文乱码问题