데이터베이스의 데이터들을 csv등의 파일로 export / import 할 때,
정확한 데이터를 내려받고 올리고 하기위해
' 또는 " 등의 구분자를 통해 컬럼/레코드를 구분한다.
그런데 만약 컬럼의 구분자를 '로 지정했는데 (보통 이게 기본값이다)
데이터값에 '가 여러번 포함되어 있다면?
이러한 여러 경우의 수를 대비하기 위해
FIELDS TERMINATED BY 등의 구문으로 구분자를 특수한 값으로 설정하여 (예를들면 !@^@^)
데이터가 틀어짐을 방지한다.
하지만 예전에는 구분자가 1byte밖에 지원이 안되어 난감했는데[,
지금은 멀티바이트를 지원하는지 두가지정도만 해 보았다.
▼mysql (mariaDB로 테스트) export/imort -> 쿼리문 사용
SELECT * FROM (
(
SELECT
'ID' AS 'ID',
'NAME' AS 'NAME'
) UNION (
SELECT
id,
name
FROM heni1
)
) AS heni1
INTO OUTFILE '1_table.csv'
FIELDS TERMINATED BY 'kim' OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY 'heni'
LOAD DATA LOCAL INFILE '1_table.csv'
-> INTO TABLE imheni1
-> FIELDS TERMINATED BY 'kim' OPTIONALLY ENCLOSED BY '"'
-> ENCLOSED BY '"'
-> LINES TERMINATED BY 'heni' (id, name);
MariaDB [test]> SELECT * FROM (
-> (
-> SELECT
-> 'ID' AS 'ID',
-> 'NAME' AS 'NAME'
-> ) UNION (
-> SELECT
-> id,
-> name
-> FROM heni1
-> )
-> ) AS heni1
-> INTO OUTFILE 'heni1_table_test3.csv'
-> CHARACTER SET euckr
-> FIELDS TERMINATED BY ',,,' OPTIONALLY ENCLOSED BY '""';
ERROR 1083 (42000): Field separator argument is not what is expected; check the manual
FIELDS TERMINATED BY ----> 컬럼 구분자 멀티바이트 지원 OK
OPTIONALLY ENCLOSED BY '"' ---> 옵셔널 컬럼 구분자 멀티바이트 지원 NO
LINES TERMINATED BY --> 레코드 구분자 멀티바이트 지원 OK
참고로 mysql같은 경우, 컬럼을 "로 구분하는데 (기본값)
만약 데이터값에 "이 포함되어있으면
\를 통해 구분함
a"b --> a\"b
(컬럼 구분자를 |로 바꿔도, \로 탈출)
▼MSSQL export/import -> bcp 유틸리티 사용
bcp t2 out ~/t2_test1.csv -S localhost -U sa -P password$% -d TESTDB -c -t 'kim'
[root@localhost ~] # bcp t2 out ~/t2_test2.csv -S localhost -U sa -P password$% -d TESTDB -c -t 'kim' -r 'heni'
bcp t2 in ~/t2_test1.csv -S localhost -U sa -P password$% -d TESTDB -c -t 'kim'
[root@localhost ~] # bcp t2 in ~/t2_test2.csv -S localhost -U sa -P password$% -d TESTDB -c -t 'kim' -r 'heni'
FIELDS TERMINATED BY (-t 옵션) ----> 컬럼 구분자 멀티바이트 지원 OK
OPTIONALLY ENCLOSED BY ---> 기능제공 NO
LINES TERMINATED BY (-r 옵션) --> 레코드 구분자 멀티바이트 지원 OK
[참고]