Wir haben kürzlich unser Basis-Framework auf Springboot 3.3.5 und andere verwandte Bibliotheken aktualisiert.
Während des Tests wurde mir ein Fehler gemeldet. Einige Abfragen würden mit JSqlParser 5.0 fehlschlagen.
Hier ist eine einfache Demonstration:
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()); } }
Das Problem besteht darin, dass JSqlParser 5.0 die CONVERT-Syntax CONVERT(expr, type) im MySQL-Stil nicht unterstützt. Es unterstützt nur:
SQL Server-Stil: CONVERT(type, expr)
Zeichensatzkonvertierung: CONVERT(expr USING charset)
Dies betrifft Abfragen, die die CONVERT-Funktion von MySQL verwenden, insbesondere wenn der Ausdruck komplex ist (wie die Verwendung von IF-Anweisungen).
Aktuelle Grammatik in JSqlParser:
{ <K_CONVERT> "(" ( LOOKAHEAD(ColDataType() ",") ( colDataType = ColDataType() "," expression = Expression() [ "," style = <S_LONG> ] ) | ( expression = Expression() <K_USING> transcodingName=IdentifierChain() ) ) ")" }
Für dieses Problem gibt es zwei Lösungen:
Verwenden Sie CAST anstelle von CONVERT
Ersetzen Sie einfach CONVERT(expr, type) durch CAST(expr AS type). Dies ist die einfachste Lösung, wenn Sie MySQL
Ändern Sie die JSqlParser-Grammatik, um CONVERT(expr, type) zu unterstützen
Die Grammatikregeln müssen geändert werden, um die MySQL-Syntax zu unterstützen. Seien Sie jedoch vorsichtig mit der TranscodingFunction.appendTo-Methode. Die aktuelle Implementierung generiert CONVERT(type, expr), was in SQL Server zulässig, in MySQL jedoch illegal ist
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(" )"); } }
Das obige ist der detaillierte Inhalt vonJSqlParser – Problem mit der MySQL-Konvertierungsfunktion (Ausdruck, Typ).. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!