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 编码的主要内容,如果未能解决你的问题,请参考以下文章