본문 바로가기
Infra & Server Dev

MariaDB, MySQL 이모티콘(\xF0\x9F\x98\x88) 저장시 에러

by 필팔청춘 2016. 12. 22.

MariaDB이나 MySQL에서 이모티콘 저장이 아래와 같은 에러가 날때가 있다.

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x98\x88' for column 'message' at row 2


그럼 DB character set을 변경해야합니다.




먼저 my.cnf 파일에 아래와 같이 적어 줍니다.



[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci



그리고 아래와 같이 각 DB, Table, Column에 대해서 character set을 변경해줍니다.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)


그리고 DB는 재시작해주세요.

그럼 이제 정상적으로 작동합니다.



store procedure에서 혹시 아래와 같이 발생하고 있다면 프로시저를 다시만들어 주셔야합니다.

SHOW PROCEDURE STATUS;

명령어로 우선 확인해보세요. 



org.springframework.dao.DataIntegrityViolationException: Error calling CallableStatement.getMoreResults; SQL [PROC_SEND_PUSH_ANDROID_ALL]; nested exception is org.hibernate.exception.DataException: Error calling CallableStatement.getMoreResults


Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x98\xA1' for column 'message' at row 2



해당 파라미터 뒤에 CHARSET utf8mb4를 붙여주세요.

아래와 같이

CREATE DEFINER=`blindAdmin`@`%` PROCEDURE `PROC_SEND_PUSH_ANDROID_ALL`(pushToken varchar(500), title varchar(200) CHARSET utf8mb4, message varchar(200) CHARSET utf8mb4, ticker varchar(200), pushType int(11), param1 varchar(200), param2 varchar(200), param3 varchar(200), param4 varchar(200), param5 varchar(200), param6 varchar(200), param7 varchar(200), param8 varchar(200), param9 varchar(200))


참고1 : http://xarmykwon.dothome.co.kr/board/post/48

참고2 : https://mathiasbynens.be/notes/mysql-utf8mb4

참고3 : http://dba.stackexchange.com/questions/93899/stored-procedure-to-check-if-username-exists