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

Caracteres não ingleses no banco de dados usando Java


Você realmente deveria tentar fazer tudo UTF-8 de ponto a ponto.

Use o agrupamento adequado com reconhecimento de unicode para banco de dados e tabela, eu sempre dou por tabela, mesmo que o padrão de banco de dados já tenha sido fornecido. Esta resposta tem muitos problemas de mysql + java e também de servlet, mas eles devem responder à maioria dos problemas que precisamos saber ao desenvolver aplicativos java com reconhecimento de unicode.
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;

CREATE TABLE tMyTable (
  id int(11) NOT NULL auto_increment,
  code VARCHAR(20) NOT NULL,
  name VARCHAR(20) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;

Use a cadeia de conexão jdbc para ter a tradução unicode.
<Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
  maxActive="10" maxIdle="2" maxWait="10000"
  username="myuid" password="mypwd"
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"
  validationQuery="SELECT 1"
/>

Force o Tomcat a usar o conjunto de caracteres do tipo de conteúdo para strings de parâmetro GET e POST, portanto, aplique o atributo useBodyEncodingForURI para conectores http e https (arquivo tomcat/conf/server.xml).
<Connector port="8080"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           debug="0" connectionTimeout="20000"
           disableUploadTimeout="true"
           useBodyEncodingForURI="true"
/>

No início de cada página do servlet, certifique-se de que os analisadores do Tomcat solicitem parâmetros como utf-8. Você precisa chamar setCharacterEncoding antes de ler os parâmetros ou será tarde demais. A maioria dos navegadores da Web não envia o atributo charset do tipo de conteúdo, portanto, os mecanismos de servlet podem adivinhar errado.
public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws ServletException { doPost(req, res); }

public void doPost(HttpServletRequest req, HttpServletResponse res)
      throws ServletException {
   if (req.getCharacterEncoding() == null)
      req.setCharacterEncoding("UTF-8");

   String value = request.getParameter("fieldName");
   ...
}

Tenha cuidado com a página .jsp não insira whitechars vazios ou pode ser tarde demais chamando setCharacterEncoding, veja como eu coloco marcadores de tag no final de cada linha para evitar quaisquer whitechars, também como os elementos html começam na primeira linha. Tag Jsp contentType vai para resposta http e pageEncoding significa como o arquivo é armazenado em um disco. Se você tiver apenas o editor de texto ISO-8859-15 e não codificar letras i18n em uma página jsp, você pode escolher iso* pageEncoding adequado.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 
    taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"  %><%@ 
    page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
    import="java.util.*,
             java.io.*
    "
%><%
   if (req.getCharacterEncoding() == null)
      request.setCharacterEncoding("UTF-8");
   String param1 = request.getParameter("fieldName");
%><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Page Title</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta name="keywords" content="some,fine,keywords" />
</head>
<body>
your html content goes here.... <%= param1 %>
</body>
</html>

Criando um documento xml na página jsp, você precisa escrever o cabeçalho xml sem levar whitechars ou novas linhas. Veja como o scriptlet endtag e o cabeçalho xml estão na mesma linha. Isso é o que o código jsp incorporado deve sempre levar em consideração, o whitechar líder inocente pode arruinar respostas bem formatadas.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ 
    page contentType="text/xml; charset=UTF-8" pageEncoding="ISO-8859-1"
    import="java.util.*, 
             java.io.*
    "
%><%
  // MyBean has getId() and getName() getters
  List<MyBean> items = new ArrayList<MyBean>();
  items.add( new MyBean(1, "first") );
  items.add( new MyBean(2, "second") );
  items.add( new MyBean(3, "third") );

  pageContext.setAttribute("items", items);
%><?xml version="1.0" encoding="UTF-8"?>
<mydoc>
<c:forEach var="item" items="${items}">
  <item>
    <id>${item.id}</id>
    <name>${item.name}</name>
  </item>
</c:forEach>
</mydoc>