You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
mysql> CREATE TABLE room (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(150) NOT NULL,
-> type INT NOT NULL,
-> price INT NOT NULL,
-> maximum_guest INT NOT NULL,
-> bedroom INT NOT NULL,
-> bed INT NOT NULL,
-> bath INT NOT NULL,
-> review_rating DOUBLE NOT NULL,
-> review_count INT NOT NULL,
-> location VARCHAR(45) NOT NULL,
-> latitude DOUBLE NOT NULL,
-> longitude DOUBLE NOT NULL,
-> address VARCHAR(45) NOT NULL,
-> host_id INT NOT NULL,
-> CONSTRAINT room_has_host FOREIGN KEY (host_id) REFERENCES host (id)
-> );
다음의 명령어를 통해 CSV 파일의 데이터를 테이블로 집어넣는다.
유의할 점은 CSV 파일에서 column 이름을 나타내는 맨 처음 row를 데이터 row로 인식한다는 것으로 이에 주의한다.
다시 말해 스키마에서 지정했던 column 순서대로 CSV 파일이 나열되어 있어야만 하며, 그래야 column에 맞게 테이블을 삽입할 수 있다.
mysql> LOAD DATA LOCAL INFILE '/mock_room.csv' INTO TABLE room FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Query OK, 50 rows affected (0.01 sec)
Records: 50 Deleted: 0 Skipped: 0 Warnings: 0
오류 해결하기
한글 깨짐 문제 해결하기
원인 진단
Docker에서 한글 자료가 담긴 CSV 파일을 로드했을 때, MySQL에서 한글 깨짐 문제가 발생할 수 있다.
MySQL이 담긴 도커 컨테이너를 실행할 때 다음의 명령어를 사용한다. 여기서 jypthemiracle-mysql은 도커 컨테이너 이름이다.
docker exec -it jypthemiracle-mysql bash
locale 명령어를 사용하여 현재 도커 컨테이너의 로케일 설정을 확인할 수 있다.
로케일에 관련된 다양한 환경변수의 값을 확인할 수 있다. LANG, LANGUAGE, LC_ALL은 설정되어 있지 않으며 이 로케일 설정 때문에 한글을 입력할 수 없음을 꼭 유의한다.
ko_KR.UTF-8 과 같은 로케일이 보이지 않기 때문에, 별도로 설치를 해주어야 한다.
root@4d4524c460fc:/# locale -a
C
C.UTF-8
POSIX
문제 해결하기
필자는 docker-compose.yml을 활용하여 도커에 한글 설정을 해주었다. 파일은 다음과 같다.
version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
db: # 서비스 명
image: mysql:8.0.17 # 사용할 이미지
container_name: jypthemiracle-mysql # 컨테이너 이름 설정
ports:
- "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
environment: # -e 옵션
MYSQL_ROOT_PASSWORD: "codesquad" # MYSQL 패스워드 설정 옵션
command: # 명령어 실행
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- /Users/jmlim/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)
mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
해결 방법
다음의 명령어를 통해 local_infile이 0인지, 1인지 확인한다.
mysql> SHOW VARIABLES LIKE 'local_infile';
만약 local_infile이 0이라면, MySQL 콘솔에서 나간다.
다음의 명령어를 실행하여 MySQL에 다시 접속한다.
mysql -u root -p --local-infile=1
다음의 명령어를 통해 local_infile이 1로 적절히 설정되었는 지 체크한다.
mysql> SHOW VARIABLES LIKE 'local_infile';
명령을 실행하면 정상적으로 처리가 될 것이다.
mysql> LOAD DATA LOCAL INFILE ... INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Query OK, 300 rows affected (0.01 sec)
Records: 300 Deleted: 0 Skipped: 0 Warnings: 0
기타 Tip
LOAD DATA 명령을 실행해준 다음, 실행에 Warning이 있다면 다음과 같이 메시지가 발생할 것이다.
mysql> LOAD DATA LOCAL INFILE '/root/xxxx.dat' INTO TABLE table_name;
Query OK, 4613892 rows affected, 1 warning (30.47 sec)
Records: 4613892 Deleted: 0 Skipped: 0 Warnings: 1
이 때, show warnings 명령어를 실행해주면 어떤 부분에서 Warning이 나는 지 확인할 수 있다.
단, LOAD DATA 명령어를 실행하고 바로 show warnings를 하지 않으면 데이터가 날라간다.
이후에 다른 명령어를 실행하고 show warnings를 하면 empty set으로 나타난다.
Column을 명시하는 별도의 row는 데이터를 담은 row로 인식하기 때문에 주의해야 한다.
column의 이름을 담은 row는 CSV 파일에서 제거하여 파일을 복사한다.
CSV 파일은 컴마 , 로 column을 구분한다. 각 필드에 컴마가 있어 CSV 파일이 정상적으로 파싱되지 않는지 확인해본다.
필드 텍스트에 컴마가 없어야 한다.
스키마에서 ID가 INT PRIMARY KEY AUTO_INCREMENT로 설정되어 있다고 하더라도 다음을 주의해야 한다.