SQL Server JDBC的汉字支持问题(300分)

  • 主题发起人 主题发起人 qdyoung
  • 开始时间 开始时间
Q

qdyoung

Unregistered / Unconfirmed
GUEST, unregistred user!
老问题。jdbc是从mssql主页刚下载的,jdk1.3和jdk1.4.1beta都试了
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433", "dbuser", "dbpass");
Stmt = Conn.createStatement();
System.out.println("Selecting Rows");
RS = Stmt.executeQuery("SELECT * FROM users ORDER BY username");
while (RS.next())
{
//System.out.println(RS.getString(1));
System.out.println(new String(RS.getString(1).getBytes("ISO8859_1")));
}
可以正确显示汉字。但是System.out.println(RS.getString(1));就不行。
每次getString都要变换一下实在很麻烦,不知道有没好办法?
我们知道对mysql,如果dburl中有?useUnicode=true&characterEncoding=GB2312参数
则可以直接getString不需要变换就可以正确存取汉字,我是试过的。
 
你的SQL SERVER设置的正确吗?
 
用的是jsp?
页的开头加一行
<%@ page language="java" contentType="text/html;charset=GB2312" %>
看看
 
老兄System.out.println好像是输出到后台程序里(比如Weblogic)而不是输出到页面上,不能显示中文,我想与JDBC无关吧,是不是服务端配置(显示)有问题?
我瞎猜的。
 
不懂JAVA,故而学习之。
明早来看看
 
不是jsp,就是一个简单的程序,完整程序如下:
package testsuite;
import java.sql.*;
public class mssql
{
Connection Conn = null;
ResultSet RS = null;
Statement Stmt = null;
PreparedStatement pStmt = null;
static String DBUrl = "jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;databaseName=mydb";
public static void main(String[] Args) throws Exception
{
mssql T = new mssql();
}
public mssql() throws Exception
{
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Conn = DriverManager.getConnection(DBUrl, "myuser", "mypass");
System.out.println("Selecting Rows");
Stmt = Conn.createStatement();
RS = Stmt.executeQuery("SELECT * FROM users ORDER BY username");
while (RS.next()) {
//System.out.println(RS.getString(1));
System.out.println(new String(RS.getString(1).getBytes("ISO8859_1"), "GBK"));
}

System.out.print("/nSelecting one row ");
pStmt = Conn.prepareStatement("SELECT * FROM users where username=?");
String name = "张三";
System.out.println("where name = " + name);
name = new String(name.getBytes("GBK"), "ISO8859_1");
pStmt.setString(1, name);
RS = pStmt.executeQuery();
while (RS.next()) {
//System.out.println(RS.getString(1));
System.out.println(new String(RS.getString(1).getBytes("ISO8859_1"), "GBK"));
}
}
catch (SQLException E) {
throw E;
}
finally {
if (RS != null) {
try {
RS.close();
}
catch (SQLException SQLE) {}
}

if (Stmt != null) {
try {
Stmt.close();
}
catch (SQLException SQLE) {}
}
if (Conn != null) {
try {
Conn.close();
}
catch (SQLException SQLE) {}
}
}
}
};
程序可以正确运行显示汉字,就是需要在ISO8859_1与GBK中变来变去的,烦
下面是mysql的程序,不需要变来变去:
package testsuite;
import java.sql.*;
public class mysql
{
Connection Conn = null;
ResultSet RS = null;
Statement Stmt = null;
static String DBUrl = "jdbc:mysql:///mail?useUnicode=true&amp;characterEncoding=GB2312";
public static void main(String[] Args) throws Exception
{
mysql T = new mysql();
}
public mysql() throws Exception
{
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

Conn = DriverManager.getConnection(DBUrl);
Stmt = Conn.createStatement();
System.out.println("Selecting Rows");

RS = Stmt.executeQuery("SELECT * FROM users ORDER BY username");

while (RS.next()) {
System.out.println(RS.getString(1));
}
}
catch (SQLException E) {
throw E;
}
finally {
if (RS != null) {
try {
RS.close();
}
catch (SQLException SQLE) {}
}

if (Stmt != null) {
try {
Stmt.close();
}
catch (SQLException SQLE) {}
}
if (Conn != null) {
try {
Conn.close();
}
catch (SQLException SQLE) {}
}
}
}
};
我也刚开始搞java,上面的程序是从一个jdbc例子改的
 
一般显示都是在JSP中,加上
<%@ page language="java" contentType="text/html;charset=GB2312" %>
则可解决。
你在CLASS中写数据,好象意义不大,我这边在CLASS中写数据,一般通过JSP中来触发,没什么问题
中文显示都正常。
不过是oracle805,sql7.0
sql是JDBC-ODBC连的
 
我也遇到过这个问题,后来我采用了Datasource后就没有问题的了。
com.microsoft.jdbcx.sqlserver.SQLServerDataSource datasource =
new com.microsoft.jdbcx.sqlserver.SQLServerDataSource();
datasource.setServerName("192.168.0.221");
datasource.setDatabaseName("ServiceCenter");
datasource.setLoginTimeout(10);
datasource.setUser("soft1");
datasource.setPassword("soft1");
Connection conn = datasource.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM USERS");
没有发生中文显示问题
 
1.可以考虑用jdbcodbcdriver
2.可考虑重新封装ResultSet(带encode)
 
to liaotw:
应为程序是针对不同的数据库(即mysql和sqlserver用同样的程序,因为没有用到
存储过程、函数等,所以这是可行的),
不可能专门针对sql server写不同的代码
不知道有没有更好的办法
我现在的方法是内部处理全部用iso编码,在输出时转换一下
 
参见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1199127
 
sql server没有汉字的问题,
应该是你配置上有问题,或者在使用web server时web server的问题
 
为什么我不能在jbuilder7的数据库工具中连接mssql,怎么样才可以将mssql的驱动加入使得可以直接在数据库工具中建立一个sqlserver数据库
 
在插入sqlserver时就把汉字转为ISO-8859-1码
 
Class.forName(driver).newInstance();
java.util.Properties p=new java.util.Properties();
p.put ( "user" , user ) ;
p.put ( "password" , pwd ) ;
p.put ("DatabaseName", databaseName) ;
p.put("SendStringParametersAsUnicode","true");
conn=DriverManager.getConnection(url,p);
----用ms-jdbc-sp1驱动程序
 
>>sql server没有汉字的问题
hyzou,你的断定太武断了!我就遇到过这种情况!
后来我使用了javac -encoding iso8859-1 编译后解决了这个问题。
 
sql server的确没有汉字问题,因为它目前支持几乎所有的字符集。
有汉字问题的大概只有sybase(默认字符集比较怪异)
如果问题出在数据库的话(用任何的数据库客户端都无法正确的存取),说明数据库的字符集设错了。
如果数据库没问题,那么问题可以出在编程或jdbc上。具体的稍微一查就可以找到
 
>>hyzou
这样话的任何数据库都没有中文问题,因为都可以通过字符集来解决!
 
后退
顶部