我們最近將基礎框架升級到了 springboot 3.3.5 和其他相關函式庫。
測試期間向我報告了一個錯誤。使用 JSqlParser 5.0 時某些查詢會失敗。
這是一個簡單的示範:
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 風格的 CONVERT 語法 CONVERT(expr, type)。它僅支援:
SQL Server 樣式:CONVERT(type, expr)
字符集轉換:CONVERT(expr USING charset)
這會影響使用 MySQL 的 CONVERT 函數的查詢,尤其是當表達式很複雜時(例如使用 IF 語句)。
JSqlParser 中的當前語法:
{ <K_CONVERT> "(" ( LOOKAHEAD(ColDataType() ",") ( colDataType = ColDataType() "," expression = Expression() [ "," style = <S_LONG> ] ) | ( expression = Expression() <K_USING> transcodingName=IdentifierChain() ) ) ")" }
這個問題有兩種解決方案:
使用 CAST 而不是 CONVERT
只要將 CONVERT(expr, type) 替換為 CAST(expr AS type) 即可。如果您使用 MySQL
修改 JSqlParser 語法支援 CONVERT(expr, type)
需要修改語法規則以支援MySQL語法。但是,請小心 TranscodingFunction.appendTo 方法。目前實作會產生 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) 函數的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!