반응형

 

mysql 또는 mariadb를 다루다보면 select 결과를 엑셀로 출력해야 하는 경우가 생긴다

그럴 때 짧은 내용이야 select 결과를 그냥 복사해서 붙여넣으면 되지만

데이터 크기가 커지면 상황은 달라진다

 

** 모든 변수는 ${내용} 으로 명시함

 

그렇기 때문에 다음과 같이 쿼리를 짤 경우가 생긴다.

# 줄바꿈은 보기 편함을 위함이니 쿼리 작성 시 줄바꿈 없이 작성하거나 역슬래시를 사용한다
# 역슬래시가 두개 있는 것은 역슬래시 하나를 지우고 사용하시면 됩니다(구글에서 사이트 감지 오류가 있어 수정함) 
SELECT ${생성하고싶은 컬럼}
INTO OUTFILE '${생성될 파일의 경로}'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\\n' from ${테이블 명};

INTO OUTFILE 이 결과를 어떤 파일로 생성하겠다는 명령어이고

해당명령어는 디렉토리까지가 아닌 파일명까지 명시해주어야 한다

주의해야 할 것은 mysql에 로그인한 계정이 해당 경로에 쓰기권한이 있어야 한다는 것

나는 이런식으로 했다

select SEQ, ID,DOMAIN INTO OUTFILE '/home/tools/mysql/jej/USER_INFO_20201123.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' from USER_INFO;

 

 

이 방식은 데이터 서버에 내가 들어가서 파일을 꺼내는 방식이므로

INTO OUTFILE 사용 시 해당 서버의 경로가 적용된다

 

즉, 원격지의 서버에 붙어서 위 명령어를 사용할 경우 내 서버에 해당 파일이 생성되는 것이 아닌, 원격지 서버에 파일이 생성된다


이렇게 되면 내가 해당 서버의 DB접근에만 권한이 있을 경우 파일을 가져올 수 없다.

 

그래서 이럴경우에는 다음과 같이 하자

 

cd ${mysql.home}

echo "${SELECT쿼리문}" | ./bin/mysql -Sdata/mysql.sock ${DB이름} > ${파일경로}

만약 소켓(mysql.sock)파일로 실행되는 환경이 아니라면 -Sdata/mysql.sock 대신 -u${아이디} -p 를 사용하여 아이디/비밀번호로 로그인하여 사용한다

 

${SELECT쿼리문} 에 INTO OUTFILE 등은 사용하면 안되고 일단 파일로 떨어트려야 한다

이렇게 하면 해당 select결과 데이터를 내 터미널에 가져올 수 있게 된다

 

하지만 이렇게 하면 csv파일로는 적합하지 않게 되는데

해당 파일을 vi로 열어서 다음과 같이쓰자

 

:%s/\t/,/g      // 모든 문자의 탭을 ,(콤마)로 바꾼다

:wq!              // 저장하고 나가기

 

이렇게 해서 해당 파일을 window로 가져와서 csv로 열면 정상적으로 열린다

다른이름으로 저장을 사용하여 엑셀로도 저장할 수 있다

반응형
복사했습니다!