복붙노트

[SQL] 는 JDBC 스펙 방지합니까 '?' 오퍼레이터 (인용 외부)로 사용되는?

SQL

는 JDBC 스펙 방지합니까 '?' 오퍼레이터 (인용 외부)로 사용되는?

샘 맥베스의 질문에서 :

예를 들어, 포스트 그레스 당신은 사용할 수 있습니다? 연산자로 :

SELECT * FROM tbl WHERE tbl.data ? 'abc'

JDBC 드라이버는 사용할 수 있습니다 것이라고? 연산자로 여전히 JDBC 호환 될?

해결법

  1. ==============================

    1.나는 JDBC 드라이버가 허용한다면 충분히 수용 할 것 같아? 그대로 연산자는 이스케이프와 사용할 수 있지만, 1) 실제로이 연산자에서 매개 변수를 식별하는 파서를 복잡하게 수 있으며 2)에 사용되는 어쩌면 사람 (및 도구)를 혼동 수 있는가? 유일한 매개 변수 자리 표시자를 의미한다.

    나는 JDBC 드라이버가 허용한다면 충분히 수용 할 것 같아? 그대로 연산자는 이스케이프와 사용할 수 있지만, 1) 실제로이 연산자에서 매개 변수를 식별하는 파서를 복잡하게 수 있으며 2)에 사용되는 어쩌면 사람 (및 도구)를 혼동 수 있는가? 유일한 매개 변수 자리 표시자를 의미한다.

    내 제안은 탈출 (또는 다른 연산자)의 일종을 제공하는 것입니다 그래서. 그러나 JDBC 스펙을보고, 드라이버 만에 정의 된 이스케이프를 구현하기 위해 JDBC 이스케이프 구문을 사용한다 JDBC 스펙 (13.4.2 : "이스케이프 구문은 사용자 정의 또는 공급 업체의 특정 라 함수를 호출하는 데 사용할 수 없습니다. ";이가에 대해 특별히 있지만 {FN ...}) 탈출.

    그러니 당신은 다른 탈출, 또는 '휴식'규칙 (나는 사람이 될까요 생각하지 않는다)를 사용합니다. 당신이 더 많은 권한을 보유한 대답을 원하는 경우에, 당신은 JDBC 스펙-논의 메일 링리스트에 질문을 보낼 수 있습니다. 나는 랜스 앤더슨 (JDBC 스펙 리드)에 대한 답변을 제공 할 것입니다 확신합니다.

    편집하다:

    또한 흥미로운는 JDBC 스펙 6.2 (지침 및 요구 사항)을 말한다 점에 유의하기 :

    그래서 당신은? - 연산자를 지원 (MUST NOT) 것을 기반으로, 당신은 그것을 할 수있는 실제적인 방법을 찾을 필요가있다.

    랜스 앤더슨에 따르면, JDBC 스펙은 물음표 관련하여 SQL 사양을 다음과 그들 만의 이러한 사용으로, (주석 코스와 인용 텍스트 제외) 쿼리 텍스트에서 파라미터 플레이스 홀더로 사용할 수 있습니다? PostgreSQL의의 hstore 사업자에가 허용하지 않을 것입니다. (이 메시지가 표시)

    사용할 수있는 옵션은 향후 변경이하지 ​​않습니다 충돌 제공, 하나의 별칭 또는 운영자에 대한 탈출을 제공하는 것입니다 (투시력없이 할 오히려 어렵다). 가장 좋은 방법 - 미래 JDBC 변경 문제를 방지하기 위해이 - 아마 사용자 정의 탈출이다.

    JDBC 실제로 공급 업체 탈출을 정의하지 않지만, 랜스 앤더슨은 JDBC 이스케이프 유사한 탈출을 제안하지 : {포스트 그레스 <것은 이스케이프>}; 사양과 충돌을 방지해야한다는을의 네임의 양식을 제공 할 것입니다이 탈출에 vendorname 또는 DRIVERNAME의 사용합니다. (이 메시지가 표시)

    '정상'JDBC 함수 탈출에 부합하기 위해, 나는 당신의 문제의 쿼리로 언급 될 수 탈출을 정의하는 것이 좋습니다 것입니다 :

    SELECT * FROM tbl WHERE {postgres containskey(tbl.data, 'abc')}
    

    나는의 의미에 따라 containskey을 선택? hstore 문서입니다. ?에 대한 및 유사 제안 : containsallkeys)와 대한 | : containsanykey. 일관성을 위해 당신은뿐만 아니라 다른 hstore 운영자에 대해이 작업을 수행하기 위해 고려할 수 있습니다.

    또한에만 물음표 자체를 탈출하기로 결정 할 수있다. {포스트 그레스 '?'} 또는 (물음표에 대한 QM) {포스트 그레스 QM}로 예를 탈출하십시오. 나는 가독성 내 기능 탈출 제안보다 작은 생각하십니까 :

    SELECT * FROM tbl WHERE tbl.data {postgres '?'} 'abc'
    

    전체 쿼리의 조각을 탈출하기 위해 기본적 매개 변수 표시 문자에 대해 물음표를 사용하지 않는 데이터베이스 시스템에 대한 물음표를 탈출 할 수있을 의도 표현으로 (가능성이 4.4 번호) 다음 JDBC 스펙은, 아마, 명시 적으로 JDBC 이스케이프를 추가합니다 와 물음표의 다른 용도를 지원해야합니다.

    제안 된 구문은 것 {\ <일 - 탈출> \} (이미 표준이 아닌 탈출로 오라클 JDBC 드라이버에서 지원된다). 이 구문으로, 매개 변수 표시 문자가 다음으로 탈출 할 수 {\ \?} (문자열 리터럴에서 {\\ \\?}) 또는 가독성을 높이기 위해 더 큰 조각을 탈출.

    MATCH는 JDBC 스펙-논의 메일 링리스트에 문자 및 이전 논의를 / 마커 매개 변수 JDBC를 인식 탈출 SQL 2016을 참조하십시오.

  2. ==============================

    2.최신 PostgreSQL의 드라이버가있는 경우 사용할 수 있습니다 :

    최신 PostgreSQL의 드라이버가있는 경우 사용할 수 있습니다 :

    ??
    

    원래 쿼리 변경 :

    SELECT * FROM tbl WHERE tbl.data ?? 'abc'
    

    자세한 사항은이 풀의 요청에 - https://github.com/pgjdbc/pgjdbc/pull/227 이러한 변화는 원래의 질문 후에 오래되었지만, 그것의 가치가 쉬운 대답은 지금이 있다고 지적.

  3. ==============================

    3.내가 허용 할 JDBC 스펙에 아무것도 표시되지 않는 이유는 무엇입니까? 탈출합니다. 거의 모든 IT 대해 말한다? 입니다 :

    내가 허용 할 JDBC 스펙에 아무것도 표시되지 않는 이유는 무엇입니까? 탈출합니다. 거의 모든 IT 대해 말한다? 입니다 :

    나중에 ...

    그리고 그것은 단지 그들이 같은 모습에 적용 할 수있는 어느 것도 특징의 작은 집합에 대한 이스케이프 구문을 정의?

    내가 드라이버가 허용하는 여부를 알 수 없도록 전체적으로는 (비교하는 사용해야하며해야 많은 예를 들어, 일부 W3C 사양 문서를) 매우 "엄격한"언어 한 JDBC 사양은 아닌 것 같아? 기술적으로 비 호환 될 이스케이프 할, 그러나 그것은 아마 그리 호환되지 않는 것입니다.

    심지어 심지어 포스트 그레스 드라이버가 실제로 대한 SQL 문을 구문 분석하는 드라이버의 방법으로,이를 허용하는 것처럼 보이지 않는다? 이스케이프 문자를 확인하지 않습니다.

    1. JDBC 4.1 사양, 13.2 절 - PreparedStatement의 인터페이스 2. JDBC 4.1 사양, 제 13.3.2 - 설정 매개 변수 3. JDBC 4.1 사양, 13.4 절 - 탈출 구문

  4. from https://stackoverflow.com/questions/14779896/does-the-jdbc-spec-prevent-from-being-used-as-an-operator-outside-of-quotes by cc-by-sa and MIT license