ホームページ >データベース >mysql チュートリアル >JSqlParser - MySQL Convert(expr,type) 関数の問題

JSqlParser - MySQL Convert(expr,type) 関数の問題

DDD
DDDオリジナル
2024-12-13 08:03:10270ブラウズ

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

最近、基本フレームワークを 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)
これは、特に式が複雑な場合 (IF ステートメントの使用など)、MySQL の CONVERT 関数を使用するクエリに影響します。

JSqlParser の現在の文法:

{
    <K_CONVERT> "("
    (
        LOOKAHEAD(ColDataType() ",") (
            colDataType = ColDataType()
            "," expression = Expression()
            [ "," style = <S_LONG> ]
        )
        |
        (
            expression = Expression()
            <K_USING> transcodingName=IdentifierChain()
        )
    )
    ")"
}

この問題には 2 つの解決策があります:

  1. CONVERT の代わりに CAST を使用してください
    CONVERT(expr, type) を CAST(expr AS type) に置き換えるだけです。 MySQL

  2. を使用している場合、これが最も簡単な解決策です。
  3. CONVERT(expr, type) をサポートするように JSqlParser 文法を変更します
    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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。