MariaDB / 함수 / QUOTE / 문자열을 작은 따옴표로 감싸는 함수
MariaDB의 QUOTE()는 문자열을 작은따옴표로 감싸고, 내부의 작은따옴표·역슬래시 등 SQL에서 특별하게 해석되는 문자를 이스케이프하는 함수입니다. 반환값은 SQL 문자열 리터럴을 나타내는 문자열이며, 데이터베이스에 값을 전달하는 매개변수 바인딩을 대신하는 기능은 아닙니다.
작은따옴표를 포함하는 문자열
아래 SELECT는 테이블 없이 MariaDB 클라이언트에서 실행할 수 있습니다. 문자열은 작은따옴표로 작성하고, 입력 문자열 안의 작은따옴표는 두 번 연속 적습니다. 이렇게 하면 큰따옴표의 의미를 바꾸는 ANSI_QUOTES 설정과 혼동하지 않습니다.
SELECT QUOTE('ABC') AS plain_text,
QUOTE('O''Brien') AS apostrophe,
QUOTE('"ABC"') AS double_quotes,
QUOTE('') AS empty_text;
각 열의 실제 문자열 값은 다음과 같습니다. 출력 결과를 보여주는 클라이언트가 제어 문자를 한 번 더 이스케이프할 수 있으므로 화면에 표시된 역슬래시 개수와 실제 저장 바이트를 구별해야 합니다.
plain_text: 'ABC'
apostrophe: 'O\'Brien'
double_quotes: '"ABC"'
empty_text: ''
작은따옴표는 내부에서 역슬래시와 함께 표현되고, 큰따옴표는 그대로 유지됩니다. 입력의 작은따옴표 두 개는 SQL 소스에서 하나의 문자를 나타내는 작성 방식이고, 결과의 역슬래시는 QUOTE가 생성한 문자의 일부입니다. 원래 열의 데이터를 UPDATE하거나 따옴표를 영구 저장하는 동작은 하지 않습니다.
역슬래시·NUL·Ctrl-Z 처리
QUOTE() 공식 문서에 따르면 작은따옴표와 역슬래시뿐 아니라 ASCII NUL과 Ctrl-Z도 처리합니다. 다음 예제는 입력 SQL 자체의 역슬래시 해석에 의존하지 않도록 CHAR()로 해당 바이트를 만듭니다.
SELECT QUOTE(CONCAT('a', CHAR(92), 'b')) AS backslash_text,
HEX(QUOTE(CONCAT('a', CHAR(92), 'b'))) AS backslash_hex;
SELECT QUOTE(CONCAT('a', CHAR(0), 'b', CHAR(26))) AS control_text,
HEX(QUOTE(CONCAT('a', CHAR(0), 'b', CHAR(26)))) AS control_hex;
첫 문자열은 작은따옴표로 감싼 a와 b 사이에 역슬래시 두 개가 있는 값이며 HEX 결과는 27615C5C6227입니다. 둘째는 작은따옴표로 감싼 a\0b\Z이고 HEX 결과는 27615C30625C5A27입니다. HEX는 결과의 실제 바이트를 16진수로 보여주므로 콘솔 표시 방식 때문에 헷갈릴 때 유용합니다.
QUOTE(NULL)은 SQL NULL과 다릅니다
SELECT QUOTE(NULL) AS null_literal_text,
QUOTE('NULL') AS quoted_word,
ISNULL(QUOTE(NULL)) AS is_sql_null,
LENGTH(QUOTE(NULL)) AS text_length,
HEX(QUOTE(NULL)) AS text_bytes,
ISNULL(NULL) AS actual_null;
결과는 순서대로 NULL, 작은따옴표까지 포함한 'NULL', 0, 4, 4E554C4C, 1입니다. 첫 결과는 SQL의 NULL 값이 아니라 N·U·L·L 네 문자로 된 문자열입니다. SQL 문장을 만들 때 따옴표 없는 NULL 리터럴을 나타내도록 반환하는 것이며, 콘솔에서 NULL처럼 보인다는 이유만으로 IS NULL 조건에 해당한다고 판단하면 안 됩니다.
반면 빈 문자열의 QUOTE 결과는 따옴표 두 문자입니다. NULL·빈 문자열·NULL이라는 단어는 서로 다른 입력이므로 누락 값 처리 규칙에 맞게 구분합니다.
애플리케이션에서는 바인딩을 우선
사용자가 입력한 이름이나 검색어를 SQL에 넣으려면 드라이버의 준비된 문장과 값 바인딩을 사용합니다. 다음은 SQL 수준의 동작을 확인하는 한 세션용 전체 예제입니다. Oracle 모드가 아닌 일반 모드의 MariaDB 클라이언트에서 네 문장을 같은 접속으로 실행합니다.
PREPARE quote_demo FROM 'SELECT ? AS value_text';
SET @value = 'O''Brien';
EXECUTE quote_demo USING @value;
DEALLOCATE PREPARE quote_demo;
조회 결과는 O'Brien 한 값입니다. 물음표를 따옴표로 감싸거나 @value에 QUOTE()를 추가하지 않습니다. PHP 등에서는 해당 드라이버의 바인딩 API를 사용하며, SQL 문자열 생성과 실제 값 전달을 분리합니다. PREPARE의 매개변수 표식은 값 표현식 자리에서 사용하며 테이블명·열명·SQL 키워드를 대신하지 않습니다. 동적인 정렬 열 등은 허용 목록으로 별도 검증합니다.
QUOTE가 만든 표현을 다시 SQL 소스로 해석하려면 접속 문자셋과 SQL 모드가 맞아야 합니다. 특히 NO_BACKSLASH_ESCAPES에서는 역슬래시가 일반 문자이므로, QUOTE 결과를 모든 모드에서 안전한 SQL 조각으로 간주하면 안 됩니다. 문자열 리터럴의 해석 규칙은 MariaDB 문자열 리터럴 문서에서 확인할 수 있습니다. HTML 출력·JSON 생성·CSV 저장에는 각 형식의 인코더를 사용하며 QUOTE를 공통 이스케이프 함수로 재사용하지 않습니다.




