Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Nicht-englische Zeichen in der Datenbank mit Java

Sie sollten wirklich versuchen, alles UTF-8 von Punkt zu Punkt zu machen.

Verwenden Sie eine geeignete Unicode-fähige Sortierung für Datenbank und Tabelle, ich gebe immer pro Tabelle an, auch wenn db default bereits angegeben wurde. Diese Antwort enthält viele mysql+java- und auch Servlet-Probleme, aber sie sollten die meisten Probleme beantworten, die wir wissen müssen, wenn wir Unicode-fähige Java-Anwendungen entwickeln.

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;

Verwenden Sie die jdbc-Verbindungszeichenfolge, um eine Unicode-Übersetzung zu erhalten.

<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"
/>

Zwingen Sie Tomcat, den Zeichensatz des Inhaltstyps sowohl für GET- als auch für POST-Parameterzeichenfolgen zu verwenden, wenden Sie also das Attribut useBodyEncodingForURI für http- und https-Konnektoren an (Datei 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"
/>

Stellen Sie zu Beginn jeder Servlet-Seite sicher, dass Tomcat-Parser Parameter als utf-8 anfordern. Sie müssen setCharacterEncoding aufrufen, bevor Sie Parameter lesen, oder es ist zu spät. Die meisten Webbrowser senden kein Charset-Attribut für den Inhaltstyp, sodass Servlet-Engines es falsch einschätzen können.

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");
   ...
}

Seien Sie vorsichtig mit der .jsp-Seite, fügen Sie keine leeren führenden Whitechars ein, oder es kann zu spät sein, setCharacterEncoding aufzurufen, sehen Sie, wie ich Tag-Markierungen am Ende jeder Zeile einfüge, um Whitechars zu vermeiden, und wie HTML-Elemente von der ersten Zeile beginnen. JSP-Tag contentType geht zu http response und pageEncoding bedeutet, wie die Datei auf einer Festplatte gespeichert wird. Wenn Sie nur einen ISO-8859-15-Texteditor haben und keine i18n-Buchstaben in einer JSP-Seite fest codieren, können Sie die richtige iso* pageEncoding wählen.

<%@ 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>

Beim Erstellen eines XML-Dokuments auf einer JSP-Seite müssen Sie den XML-Header ohne führende Whitechars oder Zeilenumbrüche schreiben. Sehen Sie, wie sich das Skriptlet-Endtag und der XML-Header in derselben Zeile befinden. Dies ist, was eingebetteter JSP-Code immer berücksichtigen muss, unschuldiges führendes Whitechar kann gut formatierte Antworten ruinieren.

<%@ 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>