首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC iso-8859-1编码

JDBC iso-8859-1编码
EN

Stack Overflow用户
提问于 2014-07-30 21:01:20
回答 3查看 4.8K关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

发布于 2014-07-31 00:02:48

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

该错误可能源于:

  • java中的硬编码文字字符串: java源代码的编码必须与java编译器javac的编码相同。这可以通过尝试\u00FC而不是ü__.
  • Driver settings
  • Connection settings
  • Database / table / column definitions
  • False placed : when outputting,when inputting

来测试

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

代码语言:javascript
复制
Arrays.toString(string.getBytes("ISO-8859-1"));

Do 不尝试像new String(s.getBytes("ISO-8859-1"), "UTF-8")那样的修复--或者更多。

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

顺便说一下:最好使用Windows-1252 (Windows拉丁语-1)而不是ISO-8859 (拉丁语-1),因为它允许使用一些特殊字符,如逗号引号(范围为0x80 - 0xBF)。HTML也接受Windows-1252作为ISO-8859-1。

票数 2
EN

Stack Overflow用户

发布于 2014-07-30 23:36:24

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

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

代码语言:javascript
复制
String aValue = "äöü";
String insert = "INSERT INTO table VALUES('" + aValue + "')";
Statement s = connection.createStatement();
s.executeUpdate(insert);

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

代码语言:javascript
复制
String aValue = "äöü";
String insert = "INSERT INTO table VALUES(?)";
PreparedStatement s = connection.prepareStatement(insert);
s.setString(1, aValue);
s.executeUpdate();

编辑:还要确保您尝试插入的内容确实是您想要插入的内容。对于德语元音,unicode中有多种可能的表示形式,例如,ö可以表示为"\u00F6",但它也可以(很少,取决于来源)使用组合变音符号表示(例如,"o\u0308“也类似于ö)。

票数 1
EN

Stack Overflow用户

发布于 2017-02-24 21:37:49

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

代码语言:javascript
复制
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支持特定的属性来设置编码。

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

代码语言:javascript
复制
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 );
}

并从数据库中读取:

代码语言:javascript
复制
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 );
}   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25037522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档