[공유] mysql/mariadb utf8mb4 언어셋 설명

데이터베이스/mysql|2018. 11. 6. 22:59

mysql 을 사용하다보면 utf8 캐릭터 셋을 자주 사용한다. 그 중에서도 여러 패키지가 존재하는데 잘 알지 못하고 사용하는 것 같다.


주로 사용하는 캐릭터 셋을 정리된 글을 공유해본다. 

핵심 부분만 정리했다. 자세한 내용은 아래 출저 페이지에가서 보면 좋은 공부가 될 것 같다.


- Mysql에서 주로 보는 Charset과 collection이 있는데 각각 문자집합과 정렬을 뜻한다.

- utf8은 1 ~ 4 바이트까지 저장할 수 있도록 설계된 가변 바이트 자료형이다.

- Mysql에서는 utf8을 3바이트 가변 자료형으로 저장한다. (chraset: utf8, collation: utf8_general_ci)

- emoji와 같은 문자는 4바이트이기 때문에 해당 필드에 저장하면 문제 발생

- Mysql 5.5.3부터 가변 4바이트가 제공되는 utf8mb4가 추가됨.

- 기존 mysql의 utf8_general_ci를 utf8mb4로 변경하는건 별 문제 없다. (같은 utf8)

- collation에서 사용되는 utf8_bin은 바이너리 저장 값 대로 정렬하고 utf8_general_ci는 라틴 계열 문자를 사람의 인식에 맞게 정렬하고 utf8_unicode_ci는 조금 더 특수하게 정렬됨.


출처

https://blog.lael.be/post/917

댓글()

request-promise를 통해 가져온 euc-kr 문자열 인코딩 문제 해결 (iconv)

web/node.js|2018. 10. 6. 01:31

크롤러를 만들기위해 필요로하는 페이지를 가지고 오기위해 request-promise를 사용하였다. 

요새 대부분의 홈페이지는 utf-8을 사용하기 때문에 큰 문제가 없으나 euc-kr를 사용하는 옛날 사이트들이 있다.

그런 사이트들의 정보를 그냥 request해서 가지고 오게되면 한글이 다 깨져버린다. 그것을 해결해보자.

우선 request-promise를 사용하여 데이터를 가지고 와보자.

1
2
3
4
5
6
7
8
const request = require('request-promise');
 
class Crawler {
 
  async crawler() {
    let doc = await reqest('http://url');
  }
}
cs


역시 euc-kr를 사용하는 것을 확인하고 있고 깨져있다.


iconv-lite를 사용한 디코딩

문자열의 인코딩, 디코딩을 제공해주는 라이브러리 iconv-lite 라이브러리를 다운 받는다.

1
npm install iconv-lite --save
cs


그리고 다음과 euc-kr로 인코딩 되어있는 문장을 euc-kr로 디코딩해주면 된다. 

주의※
만약 request-promise로 데이터를  데이터를 가지고 오는것이라면 encoding: null 속성을 null로 해주어야 정상적으로 디코딩이 되니 꼭 참고해야한다.

1
    let doc = iconv.decode(new Buffer(await request({url: 'http://', encoding: null})), 'EUC-KR').toString();
cs


decoding이 된 문자열

댓글()
  1. 노드암 5기 2018.12.05 07:58 댓글주소  수정/삭제  댓글쓰기

    이 글을보고 암이 나았습니다.

  2. Favicon of http://github.com/krsteve BlogIcon 메모지 2019.01.22 12:32 댓글주소  수정/삭제  댓글쓰기

    이 글을 보고 암이 나았습니다. (2)
    감사합니다.

  3. Favicon of https://blog.ggaman.com BlogIcon 2019.05.08 18:24 신고 댓글주소  수정/삭제  댓글쓰기

    이 글을 보고 암이 나았습니다. (2)
    감사합니다.

    encoding: null 이 문제였네요.