我們最近將基礎(chǔ)框架升級到了 springboot 3.3.5 和其他相關(guān)庫。
測試期間向我報(bào)告了一個(gè)錯(cuò)誤。使用 jsqlparser 5.0 時(shí)某些查詢會失敗。
這是一個(gè)簡單的演示:
public class test { public static void main(string[] args) throws jsqlparserexception { string sql = "select convert(if(bill_type = 2, id, ''), char) from dual"; statement statement2 = ccjsqlparserutil.parse(sql); system.out.println(statement2.tostring()); } }
問題在于 jsqlparser 5.0 不支持 mysql 風(fēng)格的 convert 語法 convert(expr, type)。它僅支持:
sql server 風(fēng)格:convert(type, expr)
字符集轉(zhuǎn)換:convert(expr using charset)
這會影響使用 mysql 的 convert 函數(shù)的查詢,尤其是當(dāng)表達(dá)式很復(fù)雜時(shí)(例如使用 if 語句)。
jsqlparser 中的當(dāng)前語法:
{ <k_convert> "(" ( lookahead(coldatatype() ",") ( coldatatype = coldatatype() "," expression = expression() [ "," style = <s_long> ] ) | ( expression = expression() <k_using> transcodingname=identifierchain() ) ) ")" }
這個(gè)問題有兩種解決方案:
使用 cast 而不是 convert
只需將 convert(expr, type) 替換為 cast(expr as type) 即可。如果您使用 mysql
修改 jsqlparser 語法以支持 convert(expr, type)
需要修改語法規(guī)則以支持mysql語法。但是,請小心 transcodingfunction.appendto 方法。當(dāng)前實(shí)現(xiàn)生成 convert(type, expr),這在 sql server 中是合法的,但在 mysql 中是非法的
public StringBuilder appendTo(StringBuilder builder) { if (isTranscodeStyle) { return builder .append("CONVERT( ") .append(expression) .append(" USING ") .append(transcodingName) .append(" )"); } else { return builder .append("CONVERT( ") .append(colDataType) .append(", ") .append(expression) .append(transcodingName != null && !transcodingName.isEmpty() ? ", " + transcodingName : "") .append(" )"); } }
以上就是JSqlParser-MySQL Convert(expr,type) 函數(shù)的問題的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號