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,如需转载请自行联系原作者

关于MYSQL 字符转义问题总结相关推荐

  1. html的 转义,html字符转义

    javascript 字符转义汇总 在开发中经常遇到需要字符转义的,我将一一把遇到的转义列举出来 1.今天中午做项目的时候遇到一个字符串链接的问题,需要链接的的是一个函数的参数 时间字符串:" ...

  2. mysql注入转义绕过_SQL注入防御绕过——宽字节注入

    01 背景知识 字符集 在了解宽字节注入之前,我们先来看一看字符集是什么.字符集也叫字符编码,是一种将符号转换为二进制数的映射关系. 几种常见的字符集: ASCII编码:单字节编码 latin1编码: ...

  3. php mysql n 转义,mysql转义字符_php mysql转义特殊字符函数

    摘要 腾兴网为您分享:php mysql转义特殊字符函数,中英翻译,小天才,完美root,听中国等软件知识,以及小苹果cf抽奖,宝贝,街兔电单车app,windows壁纸软件,自制表情包app,守卫剑 ...

  4. php 空格zhuanyi,php写的将逗号、空格、回车分...-php字符转义的相关注意事项-IIS环境中防止本地用户用fsockopen进行DDOS攻击的方法_169IT.COM...

    php字符转义的相关注意事项,有需要的朋友可以参考下. php中: * 以单引号为定界符的php字符串,支持两个转义\'和\\ * 以双引号为定界符的php字符串,支持下列转义: \n 换行(LF 或 ...

  5. php接口 汉字出错 空,php接口开发时,数据解析失败问题,字符转义,编码问题(示例代码)...

    php接口开发时,数据解析失败问题,字符转义,编码问题 情景: A平台--->向接口请求数据---->接口向B平台请求数据---->B平台返回数据给接口---->接口返回数据给 ...

  6. 修改mysql字符编码出现Job failed to start解决办法

    修改mysql字符编码出现Job failed to start解决办法 在python mange.py shell下填充MySQL数据库的时候,发现汉字不能输入. 于是要修改一下MySQL数据库编 ...

  7. 修改数据库mysql字符编码为UTF8

    修改数据库mysql字符编码为UTF8 Mysql数据库是一个开源的数据库,应用非常广泛.以下是修改mysql数据库的字符编码的操作过程.步骤1:查看当前的字符编码方法 mysql> show ...

  8. php 删除mysql 返回_php 返回mysql字符编码与删除字符编码

    php 返回mysql字符编码与删除字符编码 function Ebak_GetSetChar($char){ global $empire; if(empty($char)) { return '' ...

  9. python 字符转义_2500字 字符串专题总结

    我的完整施工计划 已完成专题: 1.我的施工计划 2.数值专题 这篇是字符串专题总结 除了常见的数值型,字符串是另一种常遇到的类型.一般使用一对单引号或一对双引号表示一个字符串. 字符串中如果遇到 \ ...

最新文章

  1. android分屏资源适配,android7.0分屏适配
  2. common pool2 mysql_用common-pool自定义资源池
  3. Ethernet II帧格式
  4. java获取gbk文件名 linux_Java读取linux系统中文文件名时候乱码,并显示文件不存在...
  5. 一个关于c++string比较的问题
  6. ubuntu切换JDK版本
  7. 项目从0到1避坑指南
  8. “头腾大战”烧至在线办公:微信封禁飞书做错了吗?
  9. 一文带你了解人工智能最新进展:AI从业者如何选择技术路线?
  10. 随机获取数据库的数据
  11. java 异步 阻塞io_非阻塞IO与异步IO以及Java实现
  12. usaco-pprime-pass
  13. 杨辉三角形(Python)
  14. PM Interview 60quiz
  15. 算法学习(五)—— 广度优先搜索
  16. ps 打开失败 提示:暂存盘已满
  17. Ubuntu中恢复rm命令误删文件(转)
  18. Java 程序员们值得一看的好书推荐
  19. Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)
  20. MT2601平台L1.MP9版本DWS配置方法

热门文章

  1. CSDN 湘苗培优,打造高素质技术人才
  2. 漫画:什么是 “抽象工厂模式” ?
  3. 厉害!84 行 JavaScript 代码实现塔式堆叠游戏
  4. 互联网人的生存指南 | 每日趣闻
  5. centos 7防火墙
  6. 如何用Java制作一个简易日历
  7. 网站托管的内容细节你都清楚吗?
  8. chmod g+s 、chmod o+t 、chmod u+s:Linux高级权限管理
  9. 转:场景管理--BSP
  10. Hadoop之mapreduce 实例三