2014-09-19 4 views
5

'UTF8'로 인코딩 된 PostgreSQL 9.3 데이터베이스가 있습니다. 그러나 ASCII 이외에는 절대 포함해서는 안되는 열이 데이터베이스에 있습니다. 그리고 non-ascii가 들어 오면 다른 시스템에서 제어 할 수없는 문제가 발생합니다. 따라서 열에 제약 조건을 추가하려고합니다. 참고 : 이미 BEFORE INSERT 트리거가 있으므로 확인을 수행하는 것이 좋습니다.ASCII 문자가 아닌 문자를 검사하는 Postgresql 제약

PostgreSQL에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

8

이 목적을 위해 ordinal 1 to 127ASCII을 정의 할 수 있습니다, 그래서 다음 쿼리는 "비 ASCII"값으로 문자열을 식별 :

SELECT exists(SELECT 1 from regexp_split_to_table('abcdéfg','') x where ascii(x) not between 1 and 127); 

하지만 슈퍼 효율적으로하지 가능성 및 사용 하위 쿼리를 사용하면 CHECK 제약 조건 대신 트리거에서 강제로 수행하게됩니다.

대신 정규식을 사용합니다. 인쇄 가능한 ASCII 범위 인

CHECK (my_column ~ '^[ -~]*$') 

this will match everything from the space to the tilde : 당신이 을 원하는 경우 인쇄 가능한 모든 문자는 다음처럼, 점검 제한 조건의 범위를 사용할 수 있습니다.

CHECK (my_column ~ '^[\x00-\x7F]*$') 

가 가장 엄격하게 올바른 접근 방식은 convert_to(my_string, 'ascii')로하고 실패하면 예외를 발생 할 것입니다 ...하지만 : 모든 ASCII가, 인쇄 및 인쇄 할 수없는하려면

, 당신은 use byte escapes 수 PostgreSQL은 ascii (즉, 7 비트) 인코딩을 제공하지 않으므로 접근이 불가능합니다.

3

regular expression 주위에 작성된 CHECK 제약 조건을 사용하십시오.

당신이 특정 열이 에서 소문자하지만 아무것도 포함하지 않을한다는 의미는 것을 가정 할 Z에, 에서Z에 대문자 및 숫자 을 통해 , 이것 같이 무언가는 작동해야한다.

alter table your_table add constraint allow_ascii_only check (your_column ~ '^[a-zA-Z0-9]+$'); 

은 데이터베이스 컬럼에 대하여 "오직 ASCII"에 대해 이야기 할 때 사람들 은 일반적으로 의미하지만, ASCII는 등 구두점에 대한 문자 모양, 산술 연산자, 당신이 사이에 갈 수 있도록 할 문자를 포함하는 것입니다 대괄호.

관련 문제