본문 바로가기

SQL

표준 SQL에서 문자열 상수 안의 single quote

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

SQL에서 문자열 상수를 사용할 때 작은 따옴표(single quote)로 원하는 문자열을 감싸는 것으로 표기합니다. 하지만 문자열 내부에 작은 따옴표가 존재한다면 파싱 때 문제의 소지가 있으므로 이스케이핑이란 방법으로 특수한 처리를 해야합니다. 다른 프로그래밍 언어를 공부하셨다면 문자 이스케이핑을 하기 위해서 백슬래시(\)를 가장 먼저 떠올리실겁니다.


하지만 SQL에서는 다릅니다. 정확히는 SQL 표준은 백슬래시를 사용한 이스케이프를 허용하지 않습니다. 다만 여러 RDBMS 구현체들이 사용자의 편의성과 이러저러한 이유로 백슬래시로도 이스케이핑이 가능하도록 지원하고 있습니다. 표준에서 백슬래시로 이스케이핑을 지원하지 않는 이유는 인코딩의 차이로 인해 DBMS가 백슬래시를 잘못 인식할 경우 보안적으로 문제가 생길 수 있기 때문으로 알고있습니다.


표준 SQL은 문자열 상수가 작은 따옴표를 포함할 때 작은 따옴표를 2개를 연속하여 입력해야한다고 되어있습니다. 실제로 현재 많이 쓰이는 DBMS들 중에서 가장 표준을 따르는 것으로 보이는 PostgreSQL에서 실행해보면 다음과 같이 나옵니다.


이렇게 '' 를 입력하면 '로 출력됩니다. 이스케이핑을 이렇게 처리하므로 백슬래시는 문자 그대로 표시됩니다.


참고로 PostgreSQL 설정에 백슬래시로 작은 따옴표를 이스케이프할 지 설정하는 backslash_quote 옵션과 SQL 표준에 따라서 문자열 상수를 파싱할건지 설정하는 standard_conforming_strings 옵션이 있습니다.


만약 앞으로 SQL에서 입력될 문자열을 이스케이프할 필요가 있다면 표준에 따라서 코딩을 하는 것이 이후 버전과의 호환성을 위해서라도 바람직할 것으로 보입니다. 가장 좋은 방법은 최근 대부분의 DBMS가 제공하는 Prepared Statment를 사용하는 것으로, DBMS가 전체적인 구문을 먼저 받고 이후에 전달되는 인자들을 알아서 처리하는 것으로 사용자는 이스케이프를 할 필요가 없고 SQL injection 또한 막을 수 있습니다.