Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Não é possível inserir símbolos não latinos no MySQL


Em UTF-8, Упячка deve ser representado como \x423\x43F\x44F\x447\x43A\x430 . O \xD0\xA3\xD0\xBF\xD1\x8F... implica que eles foram codificados incorretamente usando ISO-8859-1.

Aqui está um trecho de teste que prova isso:
String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
    System.out.printf("\\x%X", (int) c);
}

Que imprime
\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0

Portanto, seu problema precisa ser resolvido um passo antes. Como você está falando sobre um aplicativo da Web Java e essa string provavelmente é resultado da entrada do usuário, você tem certeza de que tomou cuidado com as codificações de solicitação e resposta HTTP? Primeiro, no JSP, você precisa adicionar o seguinte ao topo do JSP:
<%@ page pageEncoding="UTF-8" %>

Isso não apenas renderiza a página em UTF-8, mas também define implicitamente um HTTP Content-Type cabeçalho de resposta instruindo o cliente que a página é renderizada usando UTF-8, para que o cliente saiba que deve exibir qualquer conteúdo e processar todos os formulários usando a mesma codificação.

Agora, a parte da requisição HTTP, para requisições GET você precisa configurar o servletcontainer em questão. No Tomcat, por exemplo, é uma questão de configurar o URIEncoding atributo do conector HTTP em /conf/server.xml adequadamente. Para solicitações POST, isso já deve ser cuidado pelo cliente (webbrowser) ser inteligente o suficiente para usar a codificação de resposta conforme especificado na JSP. Se isso não acontecer, você precisará trazer um Filter que verifica e conjuntos a codificação da solicitação.

Para obter mais informações básicas, você pode encontrar este artigo útil.

Além de tudo isso, o MySQL tem outro problema com caracteres Unicode. Ele suporta apenas caracteres UTF-8 até 3 bytes , não 4 bytes. Em outras palavras, apenas o intervalo BMP de 65.535 caracteres é suportado, fora não. O PostgreSQL, por exemplo, o suporta totalmente. Isso pode não prejudicar seu aplicativo da web, mas certamente é algo a ter em mente.