> 데이터 베이스 > MySQL 튜토리얼 > JSqlParser- MySQL Convert(expr,type) 함수 관련 문제

JSqlParser- MySQL Convert(expr,type) 함수 관련 문제

DDD
풀어 주다: 2024-12-13 08:03:10
원래의
293명이 탐색했습니다.

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()
        )
    )
    ")"
}
로그인 후 복사

이 문제에는 두 가지 해결책이 있습니다.

  1. CONVERT 대신 CAST 사용
    CONVERT(expr, type)을 CAST(expr AS type)로 바꾸면 됩니다. 이것은 MySQL을 사용하는 경우 가장 간단한 솔루션입니다

  2. CONVERT(expr, type)를 지원하도록 JSqlParser 문법 수정
    MySQL 구문을 지원하려면 문법 규칙을 수정해야 합니다. 그러나 TranscodingFunction.appendTo 메소드에 주의하세요. 현재 구현에서는 SQL Server에서는 허용되지만 MySQL에서는 불법인 CONVERT(type, expr)를 생성합니다

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿