2012-02-10 4 views
0

나는 작업 중이며 오늘 밤에 큰 차이점을 발견 한 응용 프로그램을 가지고 있습니다. 여기에 문서를 작성하고 다른 사람이 그것을 복제하거나 설명 할 수 있는지를 생각했습니다. 쿼리는 최대했으나 문제를 보여줍니다된다PostgreSQL 정규식 일치 버전

select 
    '123' ~ '^\d+$' as result_1, 
    '123' ~ '^[0-9]+$' as result_2 

내가 윈도우 7에서 실행중인 PostgreSQL의 버전 9.1을 가지고 있고이 쿼리를 실행할 때 내가 얻을를 :

T, T

나는 우분투 10.04에 PostgreSQL의 V9.0에 대한 쿼리를 실행할 때

그러나, 내가 얻을 :

F, T

따라서 PostgreSQL은 "\ d"를 처리 할 때 v9.0과 v9.1 사이에서 변경되었거나 Windows와 Ubuntu간에 설치된 libs 사이에 차이점이있는 것으로 보입니다.

어느 쪽이든, 나는 민간인이 당신의 체크 제약 등이 둘 사이에서 똑같이 행동하지 않을 수도 있다고 생각한다.

참고 : 불행히도 9.0을 실행하는 Windows 7 상자에 쉽게 액세스 할 수 없거나 거기에서도 테스트 할 것입니다.

누구든지 설명 할 수 있습니까? 그것이 잘 알려져 있다면, 용서해주십시오. 내가봤을 때 대답을 못 봤어. 분명히해야 할 일은 양쪽 위치에서 모두 작동하기 때문에 [0-9]를 사용하는 것입니다. 그러나 다시 한번 이것이 왜 일어나는지 알고 싶습니다.

답변

2

문제가 발생했습니다. fine 9.1 manual on string quoting에서 : 구성 매개 변수 standard_conforming_strings이 꺼져있는 경우

, 다음 PostgreSQL은 백 슬래시는 일반 탈출 문자열 상수 모두에서 탈출 인식합니다. 그러나, PostgreSQL 9.1에서는 디폴트가 on으로되어있어, backslash 이스케이프는 이스케이프 캐릭터 라인 정수로만 인식됩니다.

그래서 9.1은 '\d'과 동일합니다. 따라서 'd'처럼 보입니다. 9.1에서 당신이 당신의 백 슬래시를 탈출하고 E''을 사용할 것 standard_conforming_strings 과거 얻을 문자열 표기법 "탈출"

select 
    '123' ~ E'^\\d+$' as result_1, 
    '123' ~ '^[0-9]+$' as result_2 

을 또는 당신은 dollar quoting을 시도 할 수 :

select 
    '123' ~ $re$^\d+$$re$ as result_1, 
    '123' ~ '^[0-9]+$' as result_2 

을하지만 꽤 추한 어렵다 정규식 (특히 $을 사용하여 끝을 고정시키는 정규식)을 읽으십시오.

또 다른 옵션은 사용하는 것 POSIX character class 대신 \d의 :

select 
    '123' ~ '^[[:digit:]]+$' as result_1, 
    '123' ~ '^[0-9]+$' as result_2 

당신이해야이 이런 것들에 대한 로그를,뿐만 아니라 이전 버전의 '\d'에 대한 경고를보고 확인하고 :

WARNING: nonstandard use of escape in a string literal 
LINE 1: select '\d'; 
      ^
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'. 
+0

감사! 훌륭한 대답과 설명. 나는 '123'~ E '^ \\ d + $'을 result_1로 테스트했으며, Windows와 Linux 모두에서 작동하며 9.0과 9.1 모두에서 작동합니다. –