Valor de string incorreto: \'\\xCD\\xCF\\xD7\\xA7\\xC9\\xFA...\\
Tudo no meu servidor deve estar utf8mb4
, utf8mb4_uca1400_ai_ci
então vamos analisar tudo.
Meu my.ini
arquivo no Windows 10 para MariaDB 11.4.2:
[mysql]
default-character-set = utf8mb4
[mysqld]
datadir=C:/WAMP/MariaDB/data
port=3306
innodb_buffer_pool_size=50M
character-set-server=utf8mb4
character-set-client-handshake = FALSE
collation-server = utf8mb4_uca1400_ai_ci
general-log
general-log-file=C:/WAMP/MariaDB/logs/queries.log
[client]
default-character-set = utf8mb4
port=3306
plugin-dir=C:\WAMP\MariaDB/lib/plugin
A consulta local que uso para verificar conjuntos de caracteres e comparações:
SELECT LOWER(VARIABLE_NAME) AS `variable_name`,
GLOBAL_VALUE AS `global_value`,
DEFAULT_VALUE AS `default_value`
FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES
WHERE VARIABLE_NAME LIKE '%CHARACTER_SET_%'
OR VARIABLE_NAME LIKE '%COLLATION_%'
ORDER BY `VARIABLE_NAME` ASC;
Toda vez que faço uma migração de servidor, executo o seguinte:
SET CHARACTER SET 'utf8';
SET collation_connection = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_connection = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_database = 'utf8mb4_uca1400_ai_ci';
SET GLOBAL collation_server = 'utf8mb4_uca1400_ai_ci';
Os SHOW CREATE DATABASE
retornos em utf8mb4
e utf8mb4_uca1400_ai_ci
.
A coluna associada ao erro usa utf8mb4_uca1400_ai_ci
.
Isto é para uma mensagem de e-mail com o assunto "[æ ‡é¢˜]Satisfaça todas as suas fantasias sobre a turnê da mão de Xianxia." 🙄︀ Acho que algo se perdeu na tradução. Não tenho tudo no máximo em conjuntos de caracteres e agrupamentos, embora eu ache que já cobri a maioria das coisas. Então...
O que ainda não defini corretamente para conjuntos de caracteres e/ou ordenação e como posso garantir que tudo o que é possÃvel esteja definido como utf8mb4
e utf8mb4_uca1400_ai_ci
?
O problema era com uma string sendo importada que não era compatÃvel com UTF-8, como os comentários podem confirmar. O único objetivo era relatar mensagens de e-mail que não eram compatÃveis (por uma série de razões) e ter informações identificáveis ​​suficientes para determinar qual mensagem estava causando o problema.
Usando PHP, o seguinte pega
$string
e detecta automaticamente o conjunto de caracteres inicial e o converte para UTF-8:iconv(mb_detect_encoding($string, mb_detect_order(), true), "UTF-8", $string);
Presumo que isso não funcionará em 100% dos cenários, embora tenha resolvido as instâncias do problema que encontrei. Se um problema exceder esta solução que está funcionando atualmente, postarei um Q/A diferente.