Java JDBC iso-8859-1编码
在我的程序中,我使用JTDS()连接到Microsoft SQL数据库。我的数据库的编码是iso-8859-1。然而,要用Java发送查询,我必须使用字符串(通常用UTF编码)。是否可以使用与UTF不同的编码发送查询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注入之类的安全漏洞): 编辑:还要确保要
编辑:使用“插入”或“更新”后,结果显示错误。如果我只从数据库中选择,特殊字符将显示在右侧。如果您不是简单地通过串接字符串创建插入,JDBC驱动程序实际上会在内部处理转换: (这很糟糕,千万不要这样做) 使用预先准备好的语句(这也避免了SQL注入之类的安全漏洞):
编辑:还要确保要插入的内容确实是要插入的内容。对于德语umlauts,unicode中有不止一种可能的表示法,例如,ö可以表示为“\u00F6”,但它也可以(很少,取决于来源)使用组合变音符号表示(例如,“o\u0308”看起来也像ö) java的一个突出设计原则是文本、字符串始终是Unicode。一般来说,您甚至看不到它是Unicode格式的,因为只有在获取字节时,您(应该)指示字节应转换为的编码。所以你不需要做任何事情——理想情况下 错误可能源于:
- Java中的硬编码文字字符串:Java源代码的编码必须相同
作为java编译器的编码
。这可以通过尝试javac
而不是\u00FC
来测试
- 驱动程序设置
- 连接设置
- 数据库/表/列定义
- 错误放置错误:输出结果时,输入数据时
新字符串(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 );
}