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

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

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

【问题讨论】:

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

标签: java sql-server jdbc encoding 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 );
      }   
      

      【讨论】:

        猜你喜欢
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 2018-02-21
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多