关于MYSQL 字符转义问题总结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
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,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
存储 关系型数据库 MySQL
MySQL 字符字段长度设置详解:语法、注意事项和示例
MySQL 字符字段长度设置详解:语法、注意事项和示例
870 0
|
关系型数据库 MySQL
MySQL——删除指定字符
MySQL——删除指定字符
112 1
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
关系型数据库 MySQL
mysql模糊查询指定根据第几个字符来匹配
mysql模糊查询指定根据第几个字符来匹配
289 1
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在数据集成到MySQL时,遇到特殊字符导致的脏数据如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
关系型数据库 MySQL
mysql使用where条件语句中文引号转义
mysql使用where条件语句中文引号转义
151 0
|
JavaScript 前端开发 关系型数据库
针对Mysql转义反斜杠的解决方案
针对Mysql转义反斜杠的解决方案
314 2
|
关系型数据库 MySQL
Mysql 查询以某个字符开头的语句和LIKE的使用
Mysql 查询以某个字符开头的语句和LIKE的使用
260 0
|
关系型数据库 MySQL Java
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
【MySQL用法】MySQL中大于,大于等于,小于,小于等于的转义写法
2284 0
|
JSON 关系型数据库 MySQL
MySQL的字符转义
MySQL的字符转义
155 0

推荐镜像

更多