关于mysql存储过程like查询的问题

Spring89 2012-06-20 10:11:14
create procedure query_search_apps_info(in keyword varchar(50) character set utf8,in page int)
begin
set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like ',CONCAT('%',keyword,'%'), ' order by app_priority asc,app_regtime desc limit ',page,',20');
PREPARE sqlstr from @sql;
execute sqlstr;
end




执行以上的存储过程输入参数:qq,2
结果会出错,错误是:1054 - unknown column 'qq' in field list
把keyword处写死替换成:'qq',故没错!请问这个keyword这个地方该怎么处理?
...全文
284 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2012-06-20
  • 打赏
  • 举报
回复
会不会是%也要转义一下,LZ自己试试看吧
qybao 2012-06-20
  • 打赏
  • 举报
回复
查了一下帮助文档,转义是可以用的,但是你又说不行,难搞了
http://dev.mysql.com/doc/refman/5.1/en/string-literals.html

There are several ways to include quote characters within a string:
•A “'” inside a string quoted with “'” may be written as “''”.
•A “"” inside a string quoted with “"” may be written as “""”.
•Precede the quote character by an escape character (“\”).
•A “'” inside a string quoted with “"” needs no special treatment and need not be doubled or escaped. In the same way, “"” inside a string quoted with “'” needs no special treatment.
The following SELECT statements demonstrate how quoting and escaping work:
mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

可以用''''来表示一个单引号(前后两个是表示是字符串的单引号,中间两个单引号连在一起包含在单引号中表示一个单引号字符串)
双引号和单引号差不多
还有一种就是转义 \'

所以之前都给你建议了
要么用转义
'select ... like \'',CONCAT('%',keyword,'%'), '\' order by...'
要么用两个连着的单引号''
'select ... like ''',CONCAT('%',keyword,'%'), ''' order by...'
要么把单引号包含在双引号中"'"

结果LZ都说不行,我也8知道该怎么做了,实在不行,直接用char(39)试试吧

Spring89 2012-06-20
  • 打赏
  • 举报
回复
有这个函数吗,我怎么没查到!
set @sql=concat(quote('select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like '),CONCAT('%',keyword,'%'), quote(' order by app_priority asc,app_regtime desc limit' ),page,',20');

是这样吗?可是还是不行!
qybao 2012-06-20
  • 打赏
  • 举报
回复
木有写过,不过思路就是这样了,关键是怎么在字符串中输入单引号的问题
帮你查了一下,可以用QUOTE()函数(感觉其实就是把首尾的单引号换成双引号的意思)

set @sql=concat(quote(select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like '),CONCAT('%',keyword,'%'), quote(' order by app_priority asc,app_regtime desc limit ),page,',20');
Spring89 2012-06-20
  • 打赏
  • 举报
回复
还是一样,不行!你有写过吗?

set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like ',"'",CONCAT('%',keyword,'%'), "'",' order by app_priority asc,app_regtime desc limit ',page,',20');
qybao 2012-06-20
  • 打赏
  • 举报
回复
转义不行?可能转义只适合在“”(双引号里)

试试看
like ''',CONCAT('%',keyword,'%'), '''

或者
like ',"'",CONCAT('%',keyword,'%'), "'",'...

Spring89 2012-06-20
  • 打赏
  • 举报
回复
我把like ',CONCAT('%',keyword,'%')替换成like \'',CONCAT('%',keyword,'%'), '\'
这保存就出问题啊
换成like '\'',CONCAT('%',keyword,'%'), '\',也是一样的,保存出问题!
qybao 2012-06-20
  • 打赏
  • 举报
回复
like '%xxx%' --本意应该是这样,但是LZ的结果是
like %xxx% --看到了吗? LZ的like后面的字符串少了单引号

试试看
like \'',CONCAT('%',keyword,'%'), '\'... --把单引号补上
Spring89 2012-06-20
  • 打赏
  • 举报
回复
用or,效率会将低了吧!
qybao 2012-06-20
  • 打赏
  • 举报
回复
木有用过navicat
不用in就用or
a in (1,2,3) 可以改成
a = 1 or a = 2 or a = 3
Spring89 2012-06-20
  • 打赏
  • 举报
回复
对了,不家in语句怎么处理啊!in(123,456,789)像这样有多个的!
我传的参数也是以,号分隔!那这怎么办啊
Spring89 2012-06-20
  • 打赏
  • 举报
回复
也没看到有什么设置啊!你用过navicat吗?
qybao 2012-06-20
  • 打赏
  • 举报
回复
怀疑navicat的编辑器可能有字符编码的问题(或者是设置了某些特殊字符的自动替换),LZ看看navicat有没有什么设置吧
Spring89 2012-06-20
  • 打赏
  • 举报
回复
哦,但是我这也没有用到分号啊!那就是无所谓啊!反正试了很多种,它还是不行!难到是navicat的问题吗?
qybao 2012-06-20
  • 打赏
  • 举报
回复
mysql默认分号;是结束符号,遇到分号就开始执行,但是编写存储过程的时候,会多次用到分号,但是并不希望立刻执行,所以就把结束符号改成//,改成什么LZ可以自己决定
Spring89 2012-06-20
  • 打赏
  • 举报
回复
奇怪,我就复制那段SQL,保存后,/自动去掉了!查询照样是错!
set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like '%',keyword,'%' order by app_priority asc,app_regtime desc limit ',page,',20');
Spring89 2012-06-20
  • 打赏
  • 举报
回复
mysql> delimiter //
mysql> create procedure query_search_apps_info(in keyword varchar(50) character
set utf8,in page int)
-> begin
-> set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscod
e,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like \
'%',keyword,'%\' order by app_priority asc,app_regtime desc limit ',page,',20');

-> select @sql;
-> end//

就这一段对吧?为什么要定义一个//呢
qybao 2012-06-20
  • 打赏
  • 举报
回复
木有办法,下了个mysql帮你测试了一下
以下是测试过程,用转义没问题

mysql> delimiter //
mysql> create procedure query_search_apps_info(in keyword varchar(50) character
set utf8,in page int)
-> begin
-> set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscod
e,app_score,app_icon,app_apk,app_size from joye_market_app where app_name like \
'%',keyword,'%\'
order by app_priority asc,app_regtime desc limit ',page,',20');

-> select @sql;
-> end//
Query OK, 0 rows affected (0.02 sec)

mysql> show create procedure query_search_apps_info//
+------------------------+----------+-------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------+----------------------+----------------------+--------------
------+
| Procedure | sql_mode | Create Procedure




| character_set_client | collation_connection | Database Coll
ation |
+------------------------+----------+-------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------+----------------------+----------------------+--------------
------+
| query_search_apps_info | | CREATE DEFINER=`root`@`localhost` PROCEDUR
E `query_search_apps_info`(in keyword varchar(50) character set utf8,in page int
)
begin
set @sql=concat('select app_id,app_name,app_packname,app_vsname,app_vscode,app_s
core,app_icon,app_apk,app_size from joye_market_app where app_name like \'%',key
word,'%\' order by app_priority asc,app_regtime desc limit ',page,',20');
select @sql;
end | cp932 | cp932_japanese_ci | latin1_swedish_ci |
+------------------------+----------+-------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------+----------------------+----------------------+--------------
------+
1 row in set (0.00 sec)

mysql> call query_search_apps_info('qq', 1)//
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------+
| @sql

|
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------+
| select app_id,app_name,app_packname,app_vsname,app_vscode,app_score,app_icon,a
pp_apk,app_size from joye_market_app where app_name like '%qq%' order by app_pri
ority asc,app_regtime desc limit 1,20 |
+-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

mysql>


Spring89 2012-06-20
  • 打赏
  • 举报
回复
%号应该不用转义吧,转义是不是就全成了字符串呢!
这里的%是指通配符,应该不需要转吧!
Spring89 2012-06-20
  • 打赏
  • 举报
回复
%号又该怎么转义呢!
我试了好多也是不行,你可以帮我试试吗?

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧