Java 服务器页面 - 插入 MySql 时的排序规则?

Java Server Pages - collation when inserting into MySql?

我正在使用 Java 服务器页面,并且在从我的应用程序插入数据时遇到排序规则问题。我的插入代码如下所示:

<%@page import="java.sql.*" %>
  <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <% Class.forName( "com.mysql.jdbc.Driver"); 
       Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/myapp", "root", ""); 
       Statement st=con.createStatement(); 
       ResultSet rs; 
       st.executeUpdate("insert into table values (default,1,2,šđžćč)"); %>

在我的数据库中,结果看起来像这样 š?ž?? (所以他可以看到理解 2 个字母,但不是全部)。如何修复它以便所有字母都在我的数据库中?

编辑: 我可以通过 phpmyadmin 插入带有这些字符的数据,但我不能从 .jsp 文件到数据库。就像我的 jsp 文件中的 charset = utf-8 不起作用。

问号由此而来:

  • 客户有一个有效的字符(好),并且
  • SET NAMES同意客户端的编码(好),但是
  • 目标列的 CHARACTER SET 不包含预期的字符(错误)。

示例:

  • latin1 只处理西欧字符;试 将东欧字符或任何亚洲字符放入 它不适合。
  • latin2cp1250 可以处理捷克语,所以它们之间的转换大部分都可以, 但不在他们中的任何一个和 latin1
  • 之间
  • utf8mb4utf8 的超集。 把一个utf8字符转成utf8mb4是可以的,反之 将导致“?”在某些情况下。

转换为“?”的字符无法从 table.

恢复

如何解决未来INSERTs

  • 在 table 列上使用 utf8mb4 可能适用于所有情况。
  • 否则,为与客户数据合理匹配的 table 列选择一些 CHARACTER SET

只有一些字符是 ?(在 š?ž?? 中)的原因是因为 šž 存在于 latin1 而其他字符不存在。

底线:更改 table 定义中的 CHARACTER SET

通过从旧路径添加到我的连接解决了问题

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/myapp", "root", "");

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/myapp?useUnicode=true&characterEncoding=UTF-8", "root", "");