이스케이프 문자(\)의 역할
텍스트 파일에서 MySQL 테이블로 데이터를 가져올 때, 하나의 필드 값 안에 쉼표(,)와 같은 구분자와 동일한 문자가 포함되어 있다면 이스케이프 문자(\) 사용이 필수적입니다. 이스케이프 문자가 없으면 MySQL은 쉼표를 필드 구분자로 인식하여 데이터가 엉뚱한 컬럼에 잘못 들어가게 됩니다.
구체적인 예시를 통해 살펴보겠습니다. 다음과 같은 데이터를 담고 있는 텍스트 파일 'A.txt'를 MySQL 테이블로 가져오려 한다고 가정해 보겠습니다.
id, Name, Country, Salary 105, Chum, Marsh,USA, 11000 106, Danny, Harrison,AUS, 12000
문제 상황: 이스케이프 문자 없이 데이터 가져오기
위 데이터를 보면 Name 필드에 성과 이름이 쉼표로 구분된 형태('Marsh,USA'처럼 Country 앞부분과 섞여 있음)로 저장되어 있습니다. 이제 아래 쿼리를 사용해 'A.txt' 파일의 데이터를 'employee4_tbl' 테이블로 가져와 보겠습니다.
mysql> LOAD DATA LOCAL INFILE 'd:\A.txt' INTO table employee4_tbl FIELDS TERMINATED BY ',' IGNORE 1 ROWS; Query OK, 2 rows affected, 4 warnings (0.05 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 4
쿼리 실행 결과 4개의 경고(warnings)가 발생한 것을 확인할 수 있습니다. 실제로 테이블에 어떤 값이 입력되었는지 조회해 보겠습니다.
mysql> Select * from employee4_tbl; +------+---------+----------+--------+ | Id | Name | Country | Salary | +------+---------+----------+--------+ | 105 | Chum | Marsh | 0 | | 106 | Danny | Harrison | 0 | +------+---------+----------+--------+ 2 rows in set (0.00 sec)
결과 집합을 보면, 원래 Name 필드의 일부였던 'Marsh'와 'Harrison'이 Country 컬럼의 값으로 잘못 인식되었고, Salary에는 0이 들어간 것을 알 수 있습니다. 이는 MySQL이 쉼표를 단순히 필드 구분자로만 해석했기 때문입니다.
해결 방법: 이스케이프 문자 적용하기
이러한 문제는 텍스트 파일에서 필드 내부의 쉼표 앞에 이스케이프 문자(\)를 붙여주면 해결됩니다. 수정된 'A.txt' 파일은 다음과 같습니다.
id, Name, Country, Salary 105, Chum\, Marsh,USA, 11000 106, Danny\, Harrison,AUS, 12000
'Chum\,'와 'Danny\,'처럼 쉼표 앞에 역슬래시를 붙이면, MySQL은 해당 쉼표를 필드 구분자가 아닌 값의 일부로 인식합니다. 이제 수정된 파일을 아래 쿼리로 'employee5_tbl' 테이블에 가져와 보겠습니다.
mysql> LOAD DATA LOCAL INFILE 'd:\A.txt' INTO table employee5_tbl FIELDS TERMINATED BY ',' IGNORE 1 ROWS; Query OK, 2 rows affected (0.03 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
이전과 달리 이번에는 경고가 전혀 발생하지 않았습니다. 실제로 어떻게 저장되었는지 확인해 보겠습니다.
mysql> Select * from employee5_tbl; +------+----------------+----------+--------+ | Id | Name | Country | Salary | +------+----------------+----------+--------+ | 105 | Chum,Marsh | USA | 11000 | | 106 | Danny,Harrison | AUS | 12000 | +------+----------------+----------+--------+ 2 rows in set (0.00 sec)
결론
이스케이프 문자(\)를 활용하면 'Chum,Marsh'와 'Danny,Harrison'이 각각 Name 컬럼에 온전하게 저장되고, Country와 Salary도 정확한 위치에 입력된 것을 확인할 수 있습니다. 따라서 텍스트 파일의 데이터 값 안에 필드 구분자와 같은 문자(주로 쉼표)가 포함되어 있는 경우, 반드시 해당 문자 앞에 이스케이프 문자(\)를 붙여 MySQL이 이를 올바르게 처리하도록 해야 합니다.