Heim > Datenbank > MySQL-Tutorial > JSqlParser – Problem mit der MySQL-Konvertierungsfunktion (Ausdruck, Typ).

JSqlParser – Problem mit der MySQL-Konvertierungsfunktion (Ausdruck, Typ).

DDD
Freigeben: 2024-12-13 08:03:10
Original
273 Leute haben es durchsucht

JSqlParser- problem with MySQL Convert(expr,type) function

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());
  }
}
Nach dem Login kopieren

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()
        )
    )
    ")"
}
Nach dem Login kopieren

Für dieses Problem gibt es zwei Lösungen:

  1. 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

  2. verwenden
  3. Ä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(" )");
        }
    }
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage