2017-08-01 20 views
0

私はここで奇妙なものがあります。MySQL CONCATは文字列を内部で切り捨てます。

私はかなり単純なストアドプロシージャで作業しています。 Webフォームに基づいてプロシージャに渡すことができるいくつかのパラメータがあります。それらの1つはソート順パラメータです。レコードはsong_title、artist、date_uploadedで並べ替えることができますが、最初に返されたレコードをsong_titleでソートする必要があります。これは、ユーザーがソートするためにsong_titleまたはアーティストを選択した場合はうまく動作しますが、ユーザーが 'date_uploaded'を選択した場合は爆発するようです。私は単純なIF ...を使用しているので、ソート順を評価してそれに応じて変更してください。

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 DESC は になりますdate_uplo

これについてのご意見はありますか?私はかなり問題がIFブロックの中にあると確信しています。連結コードをテストした結果、私が望む結果が得られましたが、構文に間違いがあるかどうかわかりました。

+0

'orderBy VARCHAR(20)'; 20はいくつかの "初期容量"ではなく、最大長です。 – Uueerdo

+0

変数を20文字に制限しました。 –

答えて

0

コメントが指摘したように、問題はorderBy変数の長さです。理由は次のとおりです。最大20文字と宣言されています。 song_title以外の値がある場合、orderByにはsong_title,が先頭に追加されます。その文字列は11文字です。次に、date_uploaded DESCが最初の9文字に切り捨てられ、order by節がsong_title,date_uploに設定されます。

orderBy変数を少なくとも10文字以上大きくして問題を解決します。

+0

それはうまくいった。私は、パラメータの長さがプロシージャに渡された後も拡大し続けるとは気付かず、驚いていました。何か新しいことを学んだ。本当にありがとう;これは私にナッツを運転していた。 –

+0

お寄せいただきありがとうございます。私の答えを受け入れるのは気になりますか? – schtever

+0

謝罪します。完了しました。 –

関連する問題