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

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

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



답변

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;


답변

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');


답변

데이터베이스와 테이블 모두 문자 세트 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의 차이점은 무엇입니까?


답변

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;
}


답변

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


답변

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

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) 


답변

내 답변은 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 문이 아무런 영향을 미치지 않는 이상한 버그가 발생했습니다. 오류가 발생했습니다.

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