AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78932540
Accepted
Rohit
Rohit
Asked: 2024-08-30 22:31:28 +0800 CST2024-08-30 22:31:28 +0800 CST 2024-08-30 22:31:28 +0800 CST

É possível exibir emojis em PHP com MySQL 5.x, mas não 8.x

  • 772

Tenho um projeto PHP 7.3 que atualmente usa MySQL 5.5, com utf8tabelas. Algumas das tabelas contêm dados de emoji, que aparecem bem no projeto atual. Estou tentando atualizar o projeto para MySQL 8.x, mas quando o faço, os dados de emoji aparecem incorretamente.

Primeiro, atualizei todas as tabelas 5.5 para usar uf8mb4. Nesse estado, os dados apareceram. Então atualizei para 5.7, e as coisas continuaram a funcionar. Eu despejei esses dados, atualizei para 8.0 e recarreguei (eu usei o --default-character-set=utf8mb4sinalizador em dump e load), e então os dados pararam de aparecer corretamente, por exemplo, uma lâmpada aparecendo como 💡.

Estou executando cada um desses serviços no docker. Consegui atualizar de 5.5 para 5.7 usando o mesmo volume de dados sem problemas, mas ao tentar atualizar de 5.7 para 8.0, obtive erros que não consegui resolver e acabei fazendo um dump/restauração de dados.

Uma tabela de exemplo com um campo com um emoji:

DROP TABLE IF EXISTS `forums`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `forums` (
  `forumID` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `description` text COLLATE utf8_unicode_ci,
  `forumType` varchar(1) COLLATE utf8_unicode_ci DEFAULT 'f',
  `parentID` int(11) DEFAULT NULL,
  `heritage` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
  `order` int(5) NOT NULL,
  `gameID` int(11) DEFAULT NULL,
  `threadCount` int(11) NOT NULL,
  PRIMARY KEY (`forumID`),
  UNIQUE KEY `heritage` (`heritage`),
  KEY `parentID` (`parentID`)
) ENGINE=MyISAM AUTO_INCREMENT=11551 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `forums`
--

LOCK TABLES `forums` WRITE;
/*!40000 ALTER TABLE `forums` DISABLE KEYS */;
INSERT INTO `forums` VALUES (8003,'💡 Gamers\' Plane development',NULL,'f',2,'0002-8003',3180,3181,4);
/*!40000 ALTER TABLE `forums` ENABLE KEYS */;
UNLOCK TABLES;

Para atualizar a tabela para utf8mb4 eu fiz

ALTER TABLE forums CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Como estou testando o retorno desses dados:

<?php
$mysql = new PDO("mysql:host=mysql;dbname=gamersplane", 'gamersplane', 'mypass');
$mysql->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$forum = $mysql->query('select * from forums where forumID = 8003')->fetch();
?>
<html>
<header>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</header>
<body>
<?php print_r($forum['title']); ?>
</body>
</html>

Eu li [UTF-8 até o fim][1] e

[1]: UTF-8 em todo o caminho e

  • estou usando utf8mb4no banco de dados
  • tenho charset=utf8mb4na minha string PDO
  • configurei default_charsetexplicitamente no meu php.ini e também tentei configurá-lo em tempo de execução
  • tentei Content-Type: text/html; charset=utf-8como um cabeçalho PHP, bem como uma metatag HTML
  • 1 1 respostas
  • 45 Views

1 respostas

  • Voted
  1. Best Answer
    qshurick
    2024-08-31T00:19:08+08:002024-08-31T00:19:08+08:00

    Codificar em DataBases é sempre muito divertido! Infelizmente, quando você altera o conjunto de caracteres, ele não atualiza os dados, apenas como o banco de dados interpreta os dados, assim como o MySQL não realiza alterações de codificação em tempo real e sempre grava os bytes conforme eles vêm do cliente. No exemplo, você pode ver que essa 💡é a latin1representação do 💡, e quando você despeja os dados, ele os despeja já na codificação incorreta.

    Para verificar o problema, você pode tentar converter os dados com a consulta:

    SELECT
      CONVERT(BINARY(CONVERT(title USING latin1)) USING utf8mb4)
    FROM forums 
    WHERE id = 8003;
    

    no seu ambiente MySQL8 mais recente, ele deve exibir emojis corretamente. Se sim, você deve tentar despejar os dados novamente, e dessa vez usar o charset que foi codificado originalmente, provavelmente latin1usando --default-character-set=latin1. O arquivo de despejo deve conter emojis em vez de 💡texto -like.

    Esteja ciente de que, se houver novo conteúdo na tabela, ele será codificado duas vezes ou o dump fill falhará. Se o novo texto não for compatível com a latin1codificação, seria melhor fazê-lo com o conjunto original, se você ainda tiver acesso a ele.

    • 1

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve