Estou me perguntando: supondo que tudo esteja configurado corretamente, ou seja, uma coluna com charset utf8mb4
e um cliente se conectando ao banco de dados definindo a codificação de conexão para utf8mb4
, existe alguma maneira pela qual o referido cliente poderia SELECT
dados que contêm sequências de bytes UTF-8 inválidas? Existe alguma maneira de inserir dados em uma utf8mb4
coluna que não seja de fato UTF-8 válida?
Colocado de outra forma: é razoável supor que SELECT
ing qualquer coluna não binária em uma conexão de cliente definida como utf8mb4
deve sempre retornar sequências de bytes UTF-8 válidas?
(Vamos supor SELECT *
declarações simples, sem CAST
travessuras ou algo assim.)
Eu não acho . Mas cheguei perto:
Começando com
BINARY
, depois convertendo paraCHAR
, posso obter dados inválidos na coluna. No entanto, oALTER
dá um aviso quando tento convertê-lo.Observe no final
SELECT
, os dados são truncados. O truncamento aconteceu noALTER
, não noSELECT
, onde sua pergunta queria que acontecesse. Isso pode ser verificado convertendo de volta paraBINARY
:Se você viu o problema acontecer, forneça detalhes; talvez eu possa dissecar o problema.
Ok, fique a vontade para me ajudar a entender o problema... No tópico referido os dados vêm de um campo de formulário html e foram inseridos em um campo preparado. Não houve conversão de dados após a inserção! Antes de mais nada, porque isso acontece: Um Javascript tenta interpretar a string U+1F601 como expressão para o caractere unicode do "rosto radiante com olhos sorridentes". Devo nos deixar sem detalhes, mas o bug era o apêndice de um 'A', então U+1F601A foi interpretado. Após a parte do código que testa o char para um par substituto; "\udf98\udc1a" foi deixado. Agora veja o código abaixo, ele cria uma nova tabela vazia, insere o valor da textarea.