MySQL 데이터베이스에 이모티콘 문자를 저장하는 방법


172

프로젝트에서 이모티콘 문자를 사용하고 있습니다. 해당 문자는 mysql 데이터베이스에 저장됩니다 (??). 에서 데이터베이스 기본 데이터 정렬을 사용했습니다 utf8mb4_general_ci. 그것은 보여

1366 1 열의 'comment'열에 대해 잘못된 문자열 값 : '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'


1
데이터를 어떻게 저장하고 있습니까? 그 코드를 보여줄 수 있습니까?
Tomas Buteler

1
귀하의 의견에 감사드립니다. 이 데이터베이스 변경 기본 컬렉션에 대한 해결책을 ** utf8mb4 **로, 또한 테이블 컬렉션을 ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **으로 찾았습니다. ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
셀바 마니 P

1
코드 : insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'데이터베이스 연결에서 utf8mb4 설정 : $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
Selvamani P

답변:


30

1 단계 : 데이터베이스의 기본 문자 세트를 변경하십시오.

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

2 단계 : 테이블 작성시 문자 세트를 설정하십시오.

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

또는 테이블을 변경

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

이 쿼리를 수행하고 mysql 서버를 중지했다가 다시 시작했지만 이모티콘을 표에 삽입하려고 할 때도 여전히 같은 오류가 발생합니다. INSERT를 제외한 모든 명령이 성공했습니다. ININSERT INTO 항목 (날짜, 시간, 캡션) 값 (2018-05-20 ', '12 : 38 : 00', '이모 지로 설명 테스트 : 😊❤️'); 열 설정은 데이터 정렬 : utf8mb4_0900_ai_ci 정의 : 설명 텍스트

1
연결하려면 utf8이 아닌 utf8mb4이어야합니다.
Henrik Hansen

3
@ospider, 2 단계에서 유니 코드 대신 utfmb4_general_ci를 사용합니다-이유가 무엇입니까?
Warren

263

1) 데이터베이스 : 데이터베이스 기본 데이터 정렬을로 변경하십시오 utf8mb4.

2) 테이블 : 테이블 데이터 정렬을로 변경하십시오 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

질문:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) 코드 :

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) utf8mb4데이터베이스 연결에서 설정하십시오 .

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

4
데이터베이스 기본 컬렉션을 변경하지 않고도 가능합니까?
AliN11

23
이것은 나를 위해 작동하지 않습니다. 나는 얻고있다 "???" 웃음 대신에. 이 "매우"만 smily 데이터베이스에 안전하게 만들었습니다.
Curious Developer

10
테이블을 utf8mb4로 업데이트해야 할뿐만 아니라 열 자체도 업데이트해야합니다. 그렇지 않으면 열로 표시 될 수 있습니다. 💙 대신.
Ael

2
나를 위해 일했지만 MySQL을 다시 시작하는 것을 잊지 마십시오.
Ravi Misra

8
SET NAMES utf8mb4;이모티콘 저장을 시작 하려면 실행해야합니다 . 그 명령 이전에 다음과 같이 저장되었습니다??
cubbuk

18

데이터베이스와 테이블 모두 문자 세트 utf8mb4와 데이터 정렬 이 있어야합니다utf8mb4_unicode_ci .

새 데이터베이스 를 만들 때는 다음을 사용해야합니다.

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

당신은이 경우 기존 데이터베이스를 당신은 지원을 추가하려면 :

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

또한 테이블에 올바른 문자 세트와 데이터 정렬설정 해야합니다 .

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

데이터가 많은 기존 테이블 이 있으면 변경하십시오 .

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

참고 utf8_general_ci 더 이상 모범 사례를 권장합니다. 관련 Q & A를 참조하십시오.

스택 오버플로에서 utf8_general_ci와 utf8_unicode_ci의 차이점은 무엇입니까?


나는 데이터가 포함 된 데이터베이스와 테이블을 가지고 있으며 두 번째 alter 문을 실행할 때 다음과 같이 말합니다 : ERROR 1833 (HY000) : 'id'열을 변경할 수 없습니다 : 테이블 'lizbazi.post'의 외래 키 제약 조건 'FK12njtf8e0jmyb45lqfpt6ad89'에 사용
Seyyed Mahdiyar Zerehpoush

@SeyyedMahdiyarZerehpoush – 여기에 설명 된대로 업데이트가 필요한 특정 열로 업데이트를 제한 할 수 있습니다. stackoverflow.com/a/15781925/1247581ALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

열에 utf8mb4_binvs utf8mb4_unicode_ci를 사용할 때 차이점이 있습니까?
무하마드 오메르 이슬람

14

Solr + Mysql + Java를 사용하는 경우 다음을 사용할 수 있습니다.

이것은 사용될 수 있습니다 :

  • case1 : DB를 변경하고 싶지 않은 경우
  • case2 : Mysql에서 Solr 코어로 이모티콘을 가져와야 할 때.

위의 경우 시스템에 이모티콘을 저장하는 솔루션 중 하나입니다.

사용 단계 :

사용 된 라이브러리 : import java.net.URLDecoder; 수입 java.net.URLEncoder;

  1. 이모티콘이있는 문자열을 인코딩하려면 urlEncoder를 사용하십시오.
  2. MysqlDB를 변경하지 않고 DB에 저장하십시오.
  3. 원하는 경우 solr core (디코딩 된 양식)에 저장하거나 인코딩 된 양식을 저장할 수 있습니다.
  4. DB 또는 Solr 코어에서이 이모티콘을 가져올 때 urlDecoder를 사용하여이를 해독 할 수 있습니다.

코드 예 :

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명 보여줌으로써 장기적인 가치를 크게 향상시킬 것입니다 이것이 문제에 대한 좋은 해결책 인지 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight

1
매력처럼 작동, 나는 모델에서 그것을 사용, 그래서 난 정말 코드와 데이터베이스의 내용을 세터와 게터에 대한 데이터 모델을 변경할 필요가 없습니다
bowpunya

1
인코딩 / 디코딩 함수 호출은 문제를 일으키는 경향이 있습니다. 대신 다양한 위치에서 문자 세트 설정을 수정하십시오.
Rick James

1
이것은 문제를 해결하는 것이 아니라 우회하는 것입니다. 그리고이 방법과 관련된 많은 문제가 발생할 수 있습니다. 예를 들어 모든 것을 디코딩하고 인코딩해야하기 때문에 응용 프로그램 속도가 느려집니다. 또한 문자를 입력하면 %디코딩이 중단됩니다.
조나단 랄리 베르테

14

데이터베이스와 테이블을 utf8 에서 utf8mb4 로 업그레이드 하도록 업데이트했습니다 . 그러나 아무것도 나를 위해 작동하지 않습니다. 그런 다음 열 데이터 유형을 blob 으로 업데이트하려고했지만 운 좋게도 데이터가 저장되었습니다. 내 데이터베이스와 테이블조차도 CHARACTER SET입니다. utf8 COLLATE utf8_unicode


13

열을 수정하는 명령은 다음과 같습니다.

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

그리고 우리는 type =를 사용해야합니다. BLOB

수정하는 예는 다음과 같습니다.

ALTER TABLE messages MODIFY content BLOB;

최신 mySQL 및 기타 데이터베이스가 필요하지 않은지 확인했습니다. '' table_name, column_name 등의 명령에서 사용할 .

데이터 가져 오기 및 저장 : 채팅 내용을 열에 직접 저장하고 데이터를 검색 (byte[])하고 db 열에서 바이트 배열로 데이터를 가져온 다음 string예 를 들어 (Java 코드) 로 변환

new String((byte[]) arr) 

2
예. 특정 필드에 이모 지와 같은 유니 코드를 저장 해야하는 경우 허용되는 답변이 너무 방해 가됩니다. 간단히 text/ varchar필드를 a로 변경하면 blob완료됩니다. 그냥 :)의 전체 DB에 변환 문자 집합 및 정렬에 광기
davidkonrad

9

내 답변은 Selvamani P 답변에만 추가됩니다.

다음을 사용하여 SET NAMES utf8검색어 를 변경해야 할 수도 있습니다.SET NAMES utf8mb4 . 그것은 나를 위해 속임수를했다.

또한 이 문서는 웹 사이트를 utf8에서 utf8mb4로 이식하는 데 유용한 기사입니다. 특히이 기사는 인덱스를 utf8mb4로 변환 한 후 인덱스와 복구 테이블에 대해 2 가지 좋은 점을 제시합니다.

색인

utf8에서 utf8mb4로 변환 할 때 열 또는 인덱스 키의 최대 길이는 바이트 단위로 변경되지 않습니다. 따라서 문자의 최대 길이는 이제 3이 아닌 4 바이트이므로 문자로 인해 더 작습니다. [...] InnoDB 스토리지 엔진의 최대 인덱스 길이는 767 바이트이므로 utf8 또는 utf8mb4 열의 경우 각각 최대 255 자 또는 191 자까지 인덱스 할 수 있습니다. 현재 색인이 191자를 초과하는 utf8 열이있는 경우 utf8mb4를 사용할 때 더 적은 수의 문자를 색인화해야합니다.

수리 테이블

MySQL 서버를 업그레이드하고 위에서 설명한대로 필요한 사항을 변경 한 후에는 모든 데이터베이스와 테이블을 복구하고 최적화하십시오. 업그레이드 후 즉시이 작업을 수행하지 않았으며 (모든 것이 언뜻보기에는 정상적으로 작동하는 것처럼 필요하다고 생각하지 않았습니다) UPDATE 문이 아무런 영향을 미치지 않는 이상한 버그가 발생했습니다. 오류가 발생했습니다.

기사에서 테이블을 복구하는 쿼리에 대해 자세히 알아보십시오.


REPAIR TABLE그리고 OPTIMIZE TABLE불필요한해야 -은 ALTER그 일을하는 효과가 있습니다.
Rick James

5

위의 답변에서 요점은 언급되지 않았습니다.

옵션 "useUnicode=yes"과 함께 쿼리 문자열을 전달해야합니다."characterEncoding=UTF-8" 연결 문자열로 합니다.

이 같은

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

5

전체 DB 문자셋을 변경할 필요는 없습니다. 대신 열을 블롭 으로 변경하여 수행 할 수 있습니다 형식 .

ALTER TABLE 메시지 수정 내용 BLOB;


3

시간을 절약 할 수있는 좋은 해결책이 있습니다. 나는 또한 같은 문제를 만났지만 첫 번째 대답 으로이 문제를 해결할 수 없었습니다.

당신의 defualt 캐릭터는 utf-8입니다. 그러나 이모티콘을 지원하려면 utf8mb4가 필요합니다. mysql의 구성 파일을 수정할 수있는 권한이 있으면이 단계를 수행 할 수 있습니다.

따라서 다음 단계를 수행하여 문자 세트를 업그레이드하십시오 (utf-8에서 utf8mb4로).

단계 1. mysql에 대한 my.cnf를 열고 my.cnf에 다음 행을 추가하십시오.

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

2 단계. mysql 서비스를 중지하고 mysql 서비스를 시작하십시오.

mysql.server stop
mysql.server start

끝마친! 그런 다음 캐릭터가 utf8mb4로 변경되었는지 확인할 수 있습니다.

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

2

기술 스택이있는 애플리케이션에 대한 이모티콘 지원-MySQL, Java, SpringBoot, 최대 절전 모드

유니 코드 지원을 위해 mysql에서 아래 변경 사항을 적용하십시오.

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

DB 연결-jdbc URL 변경 :

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

참고-위의 단계가 작동하지 않으면 mysql-connector 버전을 8.0.15로 업데이트하십시오. (mysql 5.7은 유니 코드 지원을 위해 커넥터 버전 8.0.15와 함께 작동)


1

가장 효과적인 해결책은 데이터를 json_encode 로 저장하는 것 입니다.

나중에 검색 할 때 json_decode 해야합니다.

여기에서는 데이터베이스와 테이블의 데이터 정렬 또는 문자 집합을 변경할 필요가 없습니다.


0

(AWS RDS에 내 경우) 관리 MySQL의 인스턴스에서이 문제를 해결하기 위해 노력 누군가를 위해, 가장 쉬운 방법은했다 매개 변수 그룹을 수정 설정하고 서버 문자 집합 및 정렬을utf8mb4utf8mb4_bin각각. 서버를 재부팅 한 후 빠른 쿼리는 시스템 데이터베이스 및 새로 만든 데이터베이스의 설정을 확인합니다.

SELECT * FROM information_schema.SCHEMATA S;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.