原因是:
DBDriverClass=com.mysql.jdbc.Driver
DBURL=jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8
这样的URL中useUnicode=true和characterEncoding=utf-8两个属性都不好用。
所以,数据库服务器无法从URL中获知Client使用了哪个编码。于是就使用数据库服务器上默认的latin也就是iso-8859-1编码来解析用户发送的sql语句。这样,原本用户是用 *** 作系统的编码,但是服务器硬给转成ISO-8859-1,所以就乱码了。
Client端只要配置好
useUnicode=true
characterEncoding=utf-8
这两个属性。只要指定了,就不会乱码。utf-8可以,gb2312可以,gbk可以。指定了什么,Client就默认以这种
编码转换SQL语句,服务器也就知道怎么转会去。
怎么看客户端发送给服务器的SQL使用什么编码呢?
在客户端写个程序,执行SQL语句:
public void select() throws SQLException {
ResultSet rs = this.cnn.createStatement().executeQuery("SHOW VARIABLES LIKE 'character_set_%'")
while(rs.next()){
System.out.println(rs.getString(1)+","+rs.getString(2))
}
rs.close()
}
没有配置characterEncoding=utf-8之前,我使用的是DBURL=jdbc:mysql://10.4.2.52:3306/srx?useUnicode=true&characterEncoding=utf-8 这样的配置。结果用select()方法查询结果如下:
character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/mysql/charsets/
注意第一行就可以了,可见使用的是latin1。
而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Latin1解析也无法还原。
所以,我总是写乱码到DB。
而配置了配置characterEncoding=utf-8之后,
执行select(),结果:
character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8
解析。
换个工具就是了
sqlyog、mysql control center、phpmyadmin、etc
1、如果说数据库是Access,那么数据库名称就是你上传的文件名(即xxx.mdb文件,可修改),用户名和密码即自己在文件里设置,无需询问空间服务商。
2、如果说数据库是SQL-Server(即MsSQL),那么数据库服务器IP地址、数据库名称、登录用户名和密码空间服务商会告诉你的,他们告诉你什么你就填上去就可以了,一般来说网站和数据库会被安装到一台服务器上,那么服务器IP地址项就为(local)。
一、全球IP地址分配:
由IANA(Internet Assigned Numbers Authority)负责管理,官方网站是:Internet Assigned Numbers Authority。
二、数据库默认端口:
(一)、Oracle:
(1)、驱动:oracle.jdbc.driver.OracleDriver;
(2)、URL:jdbc:oracle:thin:@<machine_name><:port>:dbname;
(3)、port:端口号,默认是1521。
(二)、SQL Server:
(1)、驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver;
(2)、URL:jdbc:microsoft:sqlserver://<machine_name><:port>DatabaseName=<dbname>;
(3)、port:端口号,默认是1433。
(三)、MySQL:
(1)、驱动:org.gjt.mm.mysql.Driver;
(2)、URL:jdbc:mysql://<machine_name><:port>/dbname;
(3)、port:端口号,默认3306。
步骤分为3部:1.通过sql server 配置管理器配置1433端口
2.将sqljdbc41.jar类库添加到对应的工程中
3.在java程序中连接数据库
步骤1:打开sql server 配置管理器,点击TCP/IP右键,选择启用。将禁用的TCP/IP协议打开。
然后重启sql server(mssqlserver)服务,使得tcp/ip协议生效。
步骤2:到microsoft官网下载sqljdbc41.jar类库。http://www.microsoft.com/zh-CN/download/details.aspx?id=11774
将下载的压缩包解压,找到sqljdbc41.jar类库即可。
然后进入eclipse界面,找到的当前工程文件,点击右键,选中properties->Libraries->add external jars->找到我们刚刚下载到的sqljdbc41.jar类库,添加即可。
步骤3:
import java.sql.*
public class test3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
PreparedStatement ps=null //(这里也可以使用statement,视情况而定)
Connection ct=null
ResultSet rs=null
try {
//1.加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
String url="jdbc:sqlserver://localhost:1433databaseName=test1"
String user="sa"//sa超级管理员
String password="654321"//密码
//2.连接
ct=DriverManager.getConnection( url,user,password)
//3.创建发送端
pstmt = conn.prepareStatement("INSERT INTO staff(name, age) VALUES (?, ?)")
//通过PreparedStatement对象里的set方法去设置插入的具体数值
pstmt.setString(1, newen)
pstmt.setInt(2, 25)
pstmt.executeUpdate()
//插入成功提示
System.out.println("成功插入一条数据记录!")
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace()
}finally{
//关闭资源
try {
if(rs!=null){
rs.close()
}
if(ps!=null){
ps.close()
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
}
}
jdbc连接数据库OK!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)