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 个字符,问题就会消失。