MySQL CONCAT 截断 IF THEN 块内的字符串
MySQL CONCAT truncates string inside IF THEN block
我这里有一个奇怪的——至少对我来说很奇怪。
我正在开发一个相当简单的存储过程。有许多参数可以传递到基于 Web 表单的过程中。其中之一是排序顺序参数。记录可能按 song_title、艺术家或 date_uploaded 排序,但我总是希望返回的记录首先按 song_title 排序。如果用户选择 song_title 或艺术家作为排序依据,这很好用,但如果用户选择 'date_uploaded',它似乎会崩溃。我正在使用一个简单的 IF...THEN 块来评估排序顺序并相应地修改它。
代码如下:
DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //
CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
select concat('song_title,',orderBy);
IF orderBy='date_uploaded' THEN SET orderBy='date_uploaded DESC';END IF;
select orderBy;
IF orderBy <> 'song_title'
THEN SET orderBy=CONCAT('song_title,',orderBy);
END IF;
select orderBy;
SET @outputSQL=CONCAT('SELECT song_title, artist, disc_number, is_duet, comments
FROM track
WHERE song_title LIKE CONCAT(\'%',searchTitle,'%\')
AND artist LIKE CONCAT(\'%',searchArtist,'%\')
AND is_bad=0
AND is_duet=',duets,'
ORDER BY ',orderBy ,'
LIMIT ',startRecord,',', rowsReturned);
PREPARE stmt FROM @outputSQL;
EXECUTE stmt;
END//
DELIMITER ;
所以,发生的事情是在我尝试连接 'song_title' 的块中以及 orderBy 参数中的任何内容,它截断了该参数的值。所以
date_uploaded 描述
成为
date_uplo
对此有什么想法吗?我相当有信心问题出在 IF THEN 块内,因为我已经测试了串联代码并且它产生了我想要的结果,但如果我能看到语法有什么问题,我会大吃一惊。
正如评论所指出的,问题是 orderBy
变量的长度。这就是为什么。它被声明为最多 20 个字符。当它的值不是 song_title
时,orderBy
会在其前面加上 song_title,
。该字符串为 11 个字符。然后,date_uploaded DESC
被截断为前 9 个字符,这使您的 order by 子句设置为 song_title,date_uplo
.
将 orderBy 变量至少再增加 10 个字符,问题就会消失。
我这里有一个奇怪的——至少对我来说很奇怪。
我正在开发一个相当简单的存储过程。有许多参数可以传递到基于 Web 表单的过程中。其中之一是排序顺序参数。记录可能按 song_title、艺术家或 date_uploaded 排序,但我总是希望返回的记录首先按 song_title 排序。如果用户选择 song_title 或艺术家作为排序依据,这很好用,但如果用户选择 'date_uploaded',它似乎会崩溃。我正在使用一个简单的 IF...THEN 块来评估排序顺序并相应地修改它。
代码如下:
DROP PROCEDURE IF EXISTS spGetAllTracksSong;
DELIMITER //
CREATE PROCEDURE spGetAllTracksSong(IN startRecord INT, IN rowsReturned INT, IN searchArtist VARCHAR(255), IN searchTitle VARCHAR(244), IN orderBy VARCHAR(20), IN duets TINYINT(1))
BEGIN
select concat('song_title,',orderBy);
IF orderBy='date_uploaded' THEN SET orderBy='date_uploaded DESC';END IF;
select orderBy;
IF orderBy <> 'song_title'
THEN SET orderBy=CONCAT('song_title,',orderBy);
END IF;
select orderBy;
SET @outputSQL=CONCAT('SELECT song_title, artist, disc_number, is_duet, comments
FROM track
WHERE song_title LIKE CONCAT(\'%',searchTitle,'%\')
AND artist LIKE CONCAT(\'%',searchArtist,'%\')
AND is_bad=0
AND is_duet=',duets,'
ORDER BY ',orderBy ,'
LIMIT ',startRecord,',', rowsReturned);
PREPARE stmt FROM @outputSQL;
EXECUTE stmt;
END//
DELIMITER ;
所以,发生的事情是在我尝试连接 'song_title' 的块中以及 orderBy 参数中的任何内容,它截断了该参数的值。所以 date_uploaded 描述 成为 date_uplo
对此有什么想法吗?我相当有信心问题出在 IF THEN 块内,因为我已经测试了串联代码并且它产生了我想要的结果,但如果我能看到语法有什么问题,我会大吃一惊。
正如评论所指出的,问题是 orderBy
变量的长度。这就是为什么。它被声明为最多 20 个字符。当它的值不是 song_title
时,orderBy
会在其前面加上 song_title,
。该字符串为 11 个字符。然后,date_uploaded DESC
被截断为前 9 个字符,这使您的 order by 子句设置为 song_title,date_uplo
.
将 orderBy 变量至少再增加 10 个字符,问题就会消失。