최근 기본 프레임워크를 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() ) ) ")" }
이 문제에는 두 가지 해결책이 있습니다.
CONVERT 대신 CAST 사용
CONVERT(expr, type)을 CAST(expr AS type)로 바꾸면 됩니다. 이것은 MySQL을 사용하는 경우 가장 간단한 솔루션입니다
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!