关于MYSQL 字符转义问题总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:
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,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
2月前
|
关系型数据库 MySQL
Mysql 查询以某个字符开头的语句和LIKE的使用
Mysql 查询以某个字符开头的语句和LIKE的使用
21 0
|
4月前
|
JavaScript 前端开发 关系型数据库
针对Mysql转义反斜杠的解决方案
针对Mysql转义反斜杠的解决方案
45 2
|
10月前
|
关系型数据库 MySQL
mysql使用where条件语句中文引号转义
mysql使用where条件语句中文引号转义
49 0
|
7月前
|
关系型数据库 MySQL Java
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
338 0
|
8月前
|
JSON 关系型数据库 MySQL
MySQL的字符转义
MySQL的字符转义
42 0
|
9月前
|
关系型数据库 MySQL 数据库
60【MySQL】MySQL存不了字符引发的折腾
【MySQL】MySQL存不了字符引发的折腾
37 0
|
10月前
|
存储 关系型数据库 MySQL
MySQL中字符、字节、位之间的关系
MySQL中字符、字节、位之间的关系
61 0
|
11月前
|
SQL 关系型数据库 MySQL
MySql匹配特定的字符
MySql匹配特定的字符
57 0
|
11月前
|
关系型数据库 MySQL
Mysql匹配字符类
Mysql匹配字符类
73 2