博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于MYSQL 字符转义问题总结
阅读量:6322 次
发布时间:2019-06-22

本文共 2565 字,大约阅读时间需要 8 分钟。

1、今天写的一个存储过程,发现MYSQL的特殊字符和动态处理语句结合起来要转义好几次 。

贴出我的问题以及解决方法。


表结构:


/*DDL Information For - test.cs_test*/

--------------------------------------


Table    Create Table                             

-------  -----------------------------------------

cs_test  CREATE TABLE `cs_test` (                 

           `id` int(11) NOT NULL auto_increment,  

           `name` varchar(64) default NULL,       

           PRIMARY KEY  (`id`)                    

         ) ENGINE=InnoDB DEFAULT CHARSET=utf8     


存储过程1:(静态,也就是不用预处理的部分。)



DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_normal_test`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_normal_test`(IN f_id int,
 IN f_name varchar(64),OUT f_error_code boolean)
BEGIN
  -- Determinate whether update is successful or failed.
  declare cnt int default 0;
  -- Update to new record.
  update cs_test
  set `name` = f_name
  where id = f_id;
  -- Get the affective rows.
  set cnt = row_count();
  -- Get the last record.
  if cnt > 0 then
    set f_error_code = TRUE;
   end if;
END$$
DELIMITER ;

存储过程2:(用预处理部分。)



DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_dynamic_test`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_dynamic_test`(IN f_id int,
 IN f_name varchar(64),OUT f_error_code boolean)
BEGIN
  -- Determinate whether update is successful or failed.
  declare cnt int default 0;
  -- Update to new record.
  set @stmt = concat('update cs_test set `name` =''',f_name,'''');
  set f_error_code = FALSE;
  if f_id != 0 then
    set @stmt = concat(@stmt, ' where id = ',f_id);
  end if;
  prepare s1 from @stmt;
  execute s1;
  -- Must be above of the deallocate statement.
  set cnt = row_count();
  deallocate prepare s1;
  -- Get the last record.
  if cnt > 0 then
    set f_error_code = TRUE;
   end if;
END$$
DELIMITER ;

表之前的数据:


select * from cs_test;

结果:


uery result(9 records)

id name
1 csdn1
2 colorful1
3 bbs1
4 cu1
5 cu2
6 woshiduide
7 woshicuode
8 I'm wrong
9 I'm right

调用存储过程1:

如果你要把ID为6的记录对应的NAME字段更新为'woshiduide\n\n\n\n\n'的话,只能这样调用:


call sp_normal_test(6,'woshiduide\\n\\n\\n\\n\\n',@e);
select @e;
select * from cs_test where id = 6;

query result(1 records)

@e
1

query result(1 records)

id name
6 woshiduide\n\n\n\n\n


这里\n中的反斜杠是要转义的,要不然就会出现非自己想要的结果。

调用存储过程2:


call sp_dynamic_test(6,'woshiduide\\n\\n\\n\\n\\n',@e);
select @e;
select * from cs_test where id = 6;

结果:

query result(1 records)

@e
1

query result(1 records)

id name
6 woshiduide

这样的结果不是我们想要的。

正确调用如下:


call sp_dynamic_test(6,'woshiduide\\\\n\\\\n\\\\n\\\\n\\\\n',@e);
select @e;
select * from cs_test where id = 6;

结果:

query result(1 records)

@e
1

query result(1 records)

id name
6 woshiduide\n\n\n\n\n


这个要进行两次转义。具体原因等一下再说。因为我现在还不知道怎么表述才是最好的。

本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/81272,如需转载请自行联系原作者

你可能感兴趣的文章
一份不错的php面试题(附答案)
查看>>
前端工程资源发布、优化
查看>>
nginx安装(ubuntu14.04)
查看>>
SQLServer2008备份和恢复
查看>>
WinCE 6.0 的编译
查看>>
访问Nginx上的资源时出现403的原因及解决办法
查看>>
大家好,我是蔡某某,刚刚注册的账号,希望大家支持与帮助
查看>>
shell检测输入的IP是否合法
查看>>
30 分钟快速入门 Docker 教程
查看>>
初步计划
查看>>
Ubuntu11.10下编译android源码4.0.3
查看>>
解决安装wordpress出现"此网页包含重定向循环"
查看>>
如何关闭 CentOS7 SELinux
查看>>
vsftpd本地用户访问
查看>>
Web服务器
查看>>
python文件操作学习笔记
查看>>
朗科实习期间心得笔记(六)
查看>>
iphone编程指南学习笔记2
查看>>
NFS服务配置
查看>>
中级篇第九期:相册与拍照初使用
查看>>