Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC iso-8859-1编码_Java_Sql Server_Jdbc_Encoding_Jtds - Fatal编程技术网

Java JDBC iso-8859-1编码

Java JDBC iso-8859-1编码,java,sql-server,jdbc,encoding,jtds,Java,Sql Server,Jdbc,Encoding,Jtds,在我的程序中,我使用JTDS()连接到Microsoft SQL数据库。我的数据库的编码是iso-8859-1。然而,要用Java发送查询,我必须使用字符串(通常用UTF编码)。是否可以使用与UTF不同的编码发送查询 编辑:使用“插入”或“更新”后,结果显示错误。如果我只从数据库中选择,特殊字符将显示在右侧。如果您不是简单地通过串接字符串创建插入,JDBC驱动程序实际上会在内部处理转换: (这很糟糕,千万不要这样做) 使用预先准备好的语句(这也避免了SQL注入之类的安全漏洞): 编辑:还要确保要

在我的程序中,我使用JTDS()连接到Microsoft SQL数据库。我的数据库的编码是iso-8859-1。然而,要用Java发送查询,我必须使用字符串(通常用UTF编码)。是否可以使用与UTF不同的编码发送查询


编辑:使用“插入”或“更新”后,结果显示错误。如果我只从数据库中选择,特殊字符将显示在右侧。

如果您不是简单地通过串接字符串创建插入,JDBC驱动程序实际上会在内部处理转换:

(这很糟糕,千万不要这样做)

使用预先准备好的语句(这也避免了SQL注入之类的安全漏洞):


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

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

错误可能源于:

  • Java中的硬编码文字字符串:Java源代码的编码必须相同 作为java编译器的编码
    javac
    。这可以通过尝试
    \u00FC
    而不是
    来测试
  • 驱动程序设置
  • 连接设置
  • 数据库/表/列定义
  • 错误放置错误:输出结果时,输入数据时
尝试插入“\u00FC+u”并选择一个字节进行比较。转储字节码。(以避免控制台问题。)

不要尝试像
新字符串(s.getBytes(“ISO-8859-1”),“UTF-8”)
之类的修复

如果没有发现任何问题,则必须从别处寻找原因

顺便说一句:最好使用Windows-1252(Windows Latin-1)而不是ISO-8859(Latin-1),因为它允许一些特殊字符,比如逗号引号(范围0x80-0xBF)。HTML接受Windows-1252作为
ISO-8859-1。当我连接到使用ISO-8859-1 I编码的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 );
}   

嗯。。。你对字符编码有一些误解。您是否遇到任何问题?某些字符(如“äöüß”)显示错误。您的意思是当从数据库中检索这些字符时?首先,您必须确定编码哪里出了问题,然后需要修复它。通读JTD的文档,看看是否可以指定要使用的数据库编码。对不起,我的意思是字符串在插入或更新后存储错误。好吧,我的建议仍然有效。字符是如何显示的?你用什么来代替“ä”?
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 );
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 );
}