JDBC iso-8859-1 编码

Posted

技术标签:

【中文标题】JDBC iso-8859-1 编码【英文标题】:JDBC iso-8859-1 encoding 【发布时间】:2014-07-30 13:01:20 【问题描述】:

在我的程序中,我使用 JTDS (http://jtds.sourceforge.net/) 连接到 Microsoft SQL 数据库。我的数据库的编码是 iso-8859-1。但是,要在 Java 中发送查询,我必须使用字符串(通常使用 UTF 编码)。是否可以使用不同于 UTF 的编码发送查询?

编辑:使用 INSERT 或 UPDATE 后结果显示错误。如果我只从数据库中选择,特殊字符会正确显示。

【问题讨论】:

呃……你对字符编码有一些误解。您遇到什么问题了吗? “äöüß”等部分字符显示错误。 您是指从数据库中检索它们的时间?首先,您必须确定编码出错的地方,然后您需要修复它。通读 JTDS 的文档,看看是否可以指定要使用的数据库编码。 对不起,我的意思是插入或更新后字符串存储错误。 好吧,我的建议仍然有效。字符是如何显示的?你得到什么而不是'ä'? 【参考方案1】:

java 的一个突出设计原则是文本 String 始终是 Unicode。一般来说,你甚至看不到它是 Unicode,因为只有在获取字节时,你(应该)指示字节应该转换成的编码。 所以你不需要做任何事情——理想情况下。

错误可能源于:

Java 中的硬编码文字字符串:java 源的编码必须相同 作为java编译器javac的编码。 这可以通过尝试\u00FC 而不是ü 来测试。 驱动程序设置 连接设置 数据库/表/列定义 错误放置错误:输出结果时,输入数据时

尝试“\u00FC + ü”的 INSERT 和 SELECT 进行字节比较。转储字节码。 (避免控制台问题。)

Arrays.toString(string.getBytes("ISO-8859-1"));

不要不要尝试像new String(s.getBytes("ISO-8859-1"), "UTF-8")这样的维修 - 或者这样。

如果没有发现问题,则必须在其他地方寻找原因。

顺便说一句:最好使用 Windows-1252 (Windows Latin-1) 而不是 ISO-8859 (Latin-1),因为它允许使用一些特殊字符,例如类似逗号的引号(范围 0x80 - 0xBF)。 html 接受 Windows-1252 作为 ISO-8859-1 也是。

【讨论】:

【参考方案2】:

JDBC 驱动程序实际上在内部处理转换,如果不是只是通过连接字符串来创建插入:

(这很糟糕,永远不要这样做)

String aValue = "äöü";
String insert = "INSERT INTO table VALUES('" + aValue + "')";
Statement s = connection.createStatement();
s.executeUpdate(insert);

使用准备好的语句(也可以避免 SQL 注入等安全漏洞):

String aValue = "äöü";
String insert = "INSERT INTO table VALUES(?)";
PreparedStatement s = connection.prepareStatement(insert);
s.setString(1, aValue);
s.executeUpdate();

编辑:还要确保您尝试插入的内容确实是您想要插入的内容。对于德语变音符号,在 unicode 中存在不止一种可能的表示形式,例如ö 可以表示为“\u00F6”,但也可以(很少,取决于来源)使用组合变音符号表示(例如,“o\u0308”也看起来像 ö)。

【讨论】:

【参考方案3】:

当我连接到使用 ISO-8859-1 编码的 Access 数据库 (.mdb) 时,我 使用这个语法:

String dbPath = "fakeDBPath.mdb";
String database = "jdbc:odbc:Driver=Microsoft Access Driver (*.mdb);DBQ=" + dbPath + ";DriverID=22;READONLY=false";

final Properties prop = new Properties();
prop.put("charSet", "ISO-8859-1");
Connection conn = DriverManager.getConnection( database, prop );

获得连接后,我可以使用 Java 字符串,而无需指定任何额外的编码。 也许 JTDS 支持特定的属性来设置编码。

例如,在数据库中插入数据:

String cmd = "INSERT INTO Table (Col1,Col2,Col3,Col4) VALUES (1000,'àèìòù','é®þü','fake data');";
Statement s = DBTable_1.getStatement();
try

    int r = s.executeUpdate(cmd);
 catch ( SQLException ex )

    Logger.getLogger( Main.class.getName() ).log( Level.SEVERE, null, ex );

并从数据库中读取:

String cmd = "SELECT * FROM Table WHERE Col2='àèìòù';";
Statement s = DBTable_1.getStatement();
try

  ResultSet r = s.executeQuery(cmd);

  while(r.next())
            
    System.out.println("Col2: " + r.getString(2) + " Col3:" + r.getString(3));
  

 catch ( SQLException ex )

  Logger.getLogger( Main.class.getName() ).log( Level.SEVERE, null, ex );
   

【讨论】:

以上是关于JDBC iso-8859-1 编码的主要内容,如果未能解决你的问题,请参考以下文章

史上最难PHPer笔试题,40分就能月薪过万!

从 Ajax 调用 servlet [重复]

iso-8859-1 是啥编码

Python ISO-8859-1 编码

使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码

在 Jboss 上使用 ISO-8859-1 编码和 JSF 2