MySQL에서 문자열 데이터에 포함된 아포스트로피(작은따옴표, ')를 이스케이프 처리해야 하는 경우가 자주 발생합니다. 예를 들어 "John's"처럼 이름 중간에 작은따옴표가 들어간 값을 INSERT하려고 하면 SQL 구문 오류가 발생할 수 있습니다.
MySQL에서는 다음 두 가지 방법으로 아포스트로피를 안전하게 이스케이프할 수 있습니다.
- 백슬래시(\)를 사용하는 방법
- 작은따옴표를 두 번 연속으로 사용하는 방법
방법 1: 백슬래시(\) 사용하기
먼저 테스트용 테이블을 생성하겠습니다.
mysql> create table SingleQuotesDemo
-> (
-> id int,
-> name varchar(100)
-> );
Query OK, 0 rows affected (1.16 sec)
만약 백슬래시 없이 그대로 "John's"를 삽입하면 원하는 결과를 얻을 수 없습니다. 오히려 구문 오류가 발생하여 프롬프트가 정상적으로 돌아오지 않게 됩니다.
mysql> insert into SingleQuotesDemo values(1,'John's');
'>
이제 백슬래시를 사용하여 아포스트로피를 이스케이프해 보겠습니다.
mysql> insert into SingleQuotesDemo values(1,'John\'s');
Query OK, 1 row affected (0.19 sec)
저장된 레코드를 조회하여 확인합니다.
mysql> select * from SingleQuotesDemo;
다음 출력 결과를 보면 백슬래시를 통한 이스케이프가 올바르게 적용되었음을 알 수 있습니다.
+------+--------+
| id | name |
+------+--------+
| 1 | John's |
+------+--------+
1 row in set (0.00 sec)
방법 2: 작은따옴표 두 번 사용하기
두 번째 방법은 작은따옴표를 두 번 연속으로 입력하는 것입니다. 위에서 생성한 동일한 테이블에 새로운 레코드를 삽입해 보겠습니다.
mysql> insert into SingleQuotesDemo values(2,'John''s');
Query OK, 1 row affected (0.18 sec)
레코드를 다시 조회해 보겠습니다.
mysql> select * from SingleQuotesDemo;
출력 결과는 다음과 같습니다.
+------+--------+
| id | name |
+------+--------+
| 1 | John's |
| 2 | John's |
+------+--------+
2 rows in set (0.00 sec)
이처럼 MySQL에서는 백슬래시(\') 또는 작은따옴표 두 번('')을 사용하여 아포스트로피를 간단하게 이스케이프할 수 있습니다. 참고로 애플리케이션 코드에서 SQL 쿼리를 작성할 때는 SQL 인젝션 공격을 방지하기 위해 PreparedStatement와 같은 파라미터 바인딩 방식을 함께 사용하는 것이 좋습니다.