Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Znaki inne niż angielskie w bazie danych przy użyciu języka Java

Naprawdę powinieneś spróbować zrobić wszystko w UTF-8 od punktu do punktu.

Użyj odpowiedniego sortowania świadomego Unicode dla bazy danych i tabeli, zawsze podaję dla tabeli, nawet jeśli podano już wartość domyślną db. Ta odpowiedź zawiera wiele problemów z mysql+java, a także z serwletami, ale powinny one odpowiadać na większość problemów, które musimy znać podczas tworzenia aplikacji Java obsługujących kod 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;

Użyj ciągu połączenia jdbc, aby uzyskać tłumaczenie na kod 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"
/>

Zmuś Tomcat do używania zestawu znaków typu content dla ciągów parametrów GET i POST, więc zastosuj atrybut useBodyEncodingForURI dla łączników http i https (plik 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"
/>

Na początku każdej strony serwletu upewnij się, że parsery Tomcata żądają parametrów jako utf-8. Musisz wywołać setCharacterEncoding przed odczytaniem parametrów lub będzie za późno. Większość przeglądarek internetowych nie wysyła atrybutu charset typu treści, więc silniki serwletów mogą go źle odgadnąć.

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

Uważaj ze stroną .jsp nie wstawiaj pustych białych znaków na początku, bo może być już za późno na wywołanie setCharacterEncoding, zobacz jak umieszczam znaczniki tagów na końcu każdego wiersza, aby uniknąć białych znaków, a także jak elementy html zaczynają się od pierwszej linii. Tag Jsp contentType przechodzi do odpowiedzi http i pageEncoding oznacza sposób przechowywania pliku na dysku. Jeśli masz tylko edytor tekstu ISO-8859-15 i nie kodujesz na stałe liter i18n na stronie jsp, możesz wybrać odpowiednie kodowanie strony iso*.

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

Tworząc dokument xml na stronie jsp, musisz napisać nagłówek xml bez początkowych białych znaków lub nowych linii. Zobacz, jak znacznik końcowy skryptletu i nagłówek xml znajdują się w tym samym wierszu. To jest to, co osadzony kod jsp musi zawsze brać pod uwagę, niewinny wiodący biały znak może zrujnować dobrze sformatowane odpowiedzi.

<%@ 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lokalizacja tabel bazy danych - MySQL - Windows XP

  2. Błąd MySQL 1093 - Nie można określić tabeli docelowej do aktualizacji w klauzuli FROM

  3. Suwak formularza HTML

  4. Kiedy i dlaczego używać mysqli_fetch_row, mysqli_fetch_object, mysqli_fetch_assoc, mysqli_fetch_array

  5. Mysql -- Ostatnie 30 dni