크롤링 해 온 데이터를 db에 저장하는 과정 중 오류가 발생했다.
"Incorrect string value: '\\xF0\\x9F\\x92\\xAC\\xF0\\x9F...' for column 'reviews' at row 1"
sql 에러메시지를 살펴보니 다른 리뷰들과 다른 부분이 눈에 띄었다.
바로 😎👽🐸 이런 이모지들...!!
이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 그래서 이런 문제가 발생하는 것이다.
해결방법
1. 이모지 제거하는 정규식 사용
var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff] |[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c [\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a] |\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f |\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab] |\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04 |[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a |\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934 |\u2935|[\u2190-\u21ff])/g; return string.replace(regex, '');
이렇게 하면 이모지를 공백으로 대체할 수 있다.
2. 문자셋을 utf8mb4 로 변경
//app.module.ts
const typeOrmModuleOptions = {
useFactory: async (
configService: ConfigService,
): Promise<TypeOrmModuleOptions> => ({
namingStrategy: new SnakeNamingStrategy(),
type: 'mysql',
username: configService.get('DB_USERNAME'),
password: configService.get('DB_PASSWORD'),
host: configService.get('DB_HOST'),
port: configService.get('DB_PORT'),
database: configService.get('DB_NAME'),
autoLoadEntities: true,
synchronize: configService.get('DB_SYNC'),
logging: true,
charset: 'utf8mb4',
}),
inject: [ConfigService],
};
charset: 'utf8mb4' 부분을 추가해준다.
ALTER DATABASE 데이터베이스명 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE 테이블명 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
그리고 이미 만들어진 db라면, new query창에 이 코드를 입력해 db 또는 table의 문자셋을 변경해주면 된다!
저장이 잘 된다. 빠밤~~
'TIL' 카테고리의 다른 글
GCP Compute Engine 이용해 서버 배포하기 (0) | 2024.04.16 |
---|---|
힙 정렬 (0) | 2024.04.12 |
TIL #34) Nest로 S3 이용하기 (0) | 2024.03.25 |
TIL #33) 순서 정렬하기 (0) | 2024.03.22 |
TIL #32) Linked List 자료구조 (0) | 2024.03.20 |