Como armazenar o Carácter Emoji na Base de Dados MySQL

Estou a utilizar o carácter Emoji no meu projecto. Que os caracteres são guardados (??) na base de dados mysql. Tinha utilizado a recolha por defeito da base de dados em utf8mb4_general_ci. Mostra

1366 Valor incorreto do fio: '\xF0\x9F98\x83\xF0\x9F...' para a coluna ' comentário' na fila 1

Solução
  1. Base de dados: Alterar a recolha por defeito da base de dados como utf8mb4.

  2. Tabela: Mudar a colação da tabela como CHARACTER SET utf8mb4 COLLATE utf8mb4_bin.

Consulta:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
  1. Código:
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')
  1. Definir utf8mb4 em ligação a base de dados:
  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');
Comentários (19)

Se estiver a utilizar Solr + Mysql + Java, pode utilizar:

Isto pode ser usado:

  • caso1: Quando não se quer alterar a DB.
  • caso2: quando tem de importar emoticons do seu Mysql para o núcleo do Solr.

No caso acima, esta é uma das soluções para armazenar os seus emoticons no seu sistema.

Passos para a sua utilização:

Biblioteca utilizada: importar java.net.URLDecoder; importar java.net.URLEncoder;

  1. Use o urlEncoder para codificar a sua String tendo emoticons.
  2. Guarde-o no DB sem alterar o MysqlDB.
  3. Pode armazená-lo em solr core(decodificado) se quiser ou pode armazenar forma codificada.
  4. Ao ir buscar estes emoticons ao núcleo DB ou Solr, pode agora descodificá-los Usando o urlDecoder.

Exemplo de código:

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;
}
Comentários (4)

A minha resposta só acrescenta a Selvamani P answer.

Poderá também precisar de alterar qualquer pergunta "SET NAMES utf8" com "SET NAMES utf8mb4". Isso fez o truque por mim.

Além disso, este é um grande artigo para portar o seu website de utf8 para utf8mb4. Em particular, o artigo faz 2 bons pontos em índices e tabelas de reparação após a sua conversão para utf8mb4:

**INDEXES***

Ao converter de utf8 para utf8mb4, o comprimento máximo de uma coluna ou a chave de índice mantém-se inalterada em termos de bytes. Por conseguinte, é menor em termos de caracteres, porque o comprimento máximo de um carácter é agora quatro bytes em vez de três. [...] O motor de armazenamento InnoDB tem um comprimento máximo de índice de 767 bytes, pelo que para as colunas utf8 ou utf8mb4, pode indexar um máximo de 255 ou 191 caracteres, respectivamente. Se tiver actualmente colunas utf8 com índices superiores a 191 caracteres, terá de indexar um número menor de caracteres quando utilizar utf8mb4.

**TABELAS DE REPARAÇÃO***

Depois de actualizar o servidor MySQL e fazer as alterações necessárias explicado acima, certifique-se de reparar e optimizar todas as bases de dados e tabelas. Não fiz isto logo após a actualização (não pensei que fosse era necessário, pois tudo parecia funcionar bem à primeira vista), e deparou-se com alguns bugs estranhos onde as declarações UPDATE não tinham efeito, ainda que não tenham sido atirados erros.

Leia mais sobre as consultas para reparar as tabelas do artigo.

Comentários (1)