sql >> Databasteknik >  >> RDS >> Mysql

Icke engelska tecken i databasen med Java

Du borde verkligen försöka göra allt UTF-8 från punkt till punkt.

Använd lämplig unicode-medveten kollation för databas och tabell, jag ger alltid per tabell även om db default redan var angivet. Det här svaret har många mysql+java- och även servletproblem, men de borde svara på de flesta frågor vi behöver veta när vi utvecklar unicode-medvetna java-applikationer.

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;

Använd jdbc-anslutningssträng för att få unicode-översättning.

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

Tvinga Tomcat att använda teckenuppsättning av innehållstyp för både GET- och POST-parametersträngar, så använd useBodyEncodingForURI-attributet för http- och https-anslutningar (tomcat/conf/server.xml-fil).

<Connector port="8080"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           debug="0" connectionTimeout="20000"
           disableUploadTimeout="true"
           useBodyEncodingForURI="true"
/>

I början av varje servletsida se till att Tomcat-parsers begär parametrar som utf-8. Du måste anropa setCharacterEncoding innan du läser parametrar, annars är det för sent. De flesta webbläsare skickar inte teckenuppsättningsattribut av innehållstyp så servletmotorer kan gissa det fel.

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

Var försiktig med .jsp-sida, infoga inte tomma ledande whitechars eller så kan det vara för sent att anropa setCharacterEncoding, se hur jag sätter tagmarkörer i slutet av varje rad för att undvika eventuella whitechars, även hur html-element börjar från första raden. Jsp-tagg contentType går till http-svar och pageEncoding betyder hur filen lagras på en disk. Om du endast har ISO-8859-15-textredigerare och inte hårdkodar i18n-bokstäver på en JSP-sida kan du välja rätt iso* pageEncoding.

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

När du skapar ett xml-dokument på en jsp-sida måste du skriva xml-huvud utan att inleda vita tecken eller rader. Se hur scriptlet endtag och xml header är på samma rad. Detta är vad inbäddad jsp-kod alltid måste ta hänsyn till, oskyldiga ledande whitechar kan förstöra välformaterade svar.

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


  1. Hur make_timestamp() fungerar i PostgreSQL

  2. MySQL Alter Table Kolumn

  3. INNER JOIN vs LEFT JOIN prestanda i SQL Server

  4. SUM() Funktion i MariaDB