最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

jdbcmysql中文乱码的解决方法

来源:动视网 责编:小采 时间:2020-11-09 08:29:17
文档

jdbcmysql中文乱码的解决方法

jdbcmysql中文乱码的解决方法:通过jdbc 连接mysql 数据库的实例,以及中文乱码的解决方法: import java.sql.*;/** * 使用JDBC连接数据库MySQL的过程: * DataBase: db_test * tables: tab_test; * username: user_test; * passwd: passwd_tes
推荐度:
导读jdbcmysql中文乱码的解决方法:通过jdbc 连接mysql 数据库的实例,以及中文乱码的解决方法: import java.sql.*;/** * 使用JDBC连接数据库MySQL的过程: * DataBase: db_test * tables: tab_test; * username: user_test; * passwd: passwd_tes


通过jdbc 连接mysql 数据库的实例,以及中文乱码的解决方法: import java.sql.*;/** * 使用JDBC连接数据库MySQL的过程: * DataBase: db_test * tables: tab_test; * username: user_test; * passwd: passwd_test; * * @author zhongbo.wzb@alibaba-inc.com

通过jdbc 连接mysql 数据库的实例,以及中文乱码的解决方法:

import java.sql.*;

/**
 * 使用JDBC连接数据库MySQL的过程:
 * DataBase: db_test
 * tables: tab_test;
 * username: user_test;
 * passwd: passwd_test;
 *
 * @author zhongbo.wzb@alibaba-inc.com
 */
public class DBTest {

 public static Connection getConnection() throws SQLException, ClassNotFoundException {
 // 第一步:加载MySQL的JDBC的驱动
 Class.forName("com.mysql.jdbc.Driver");

 //取得连接的url,能访问MySQL数据库的用户名:user_test;密码:passwd_test, 数据库名: db_test
 String url = "jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=utf-8";
 String username = "user_test";
 String password = "passwd_test";

 // 第二步:创建与MySQL数据库的连接类的实例
 Connection conn = DriverManager.getConnection(url, username, password);
 return conn;
 }

 public static void main(String args[]) {
 System.out.println("args num: " + args.length);
 for (int i = 0; i < args.length; i++) {
 System.out.println("arg " + i + ": " + args[i]);
 }
 Connection conn = null;
 Statement statement = null;

 try {
 // 第三步:获取连接类实例con,用con创建Statement对象类实例 sql_statement
 conn = getConnection();
 statement = conn.createStatement();

 /*
 String sql_update = "insert into tab_test(province, num, timestamp) "
 + "values('山东', 2, '2014-04-18 00:00:00');" ;
 System.out.println(sql_update);
 statement.executeUpdate(sql_update);
 */

 // 第四步:执行查询,用ResultSet类的对象,返回查询的结果
 String query = "select * from tab_test;";
 ResultSet result = statement.executeQuery(query);
 while (result.next()) {
 System.out.print(result.getInt(1) + " \t| ");
 System.out.print(result.getString(2) + " \t| ");
 System.out.print(result.getInt(3) + " \t| ");
 System.out.println(result.getString(4));
 }

 } catch (ClassNotFoundException e) {
 System.err.print("ClassNotFoundException: " + e.getMessage());
 e.printStackTrace();
 System.exit(1);
 } catch (SQLException e) {
 System.err.println("SQLException: " + e.getMessage());
 e.printStackTrace();
 System.exit(1);
 } catch (Exception e) {
 System.err.print("Exception: " + e.getMessage());
 e.printStackTrace();
 System.exit(1);
 } finally { // release resources;
 try {
 if (statement != null) {
 statement.close();
 statement = null;
 }

 if (conn != null) {
 conn.close();
 conn = null;
 }
 } catch (SQLException e) {
 System.err.println("SQLException: " + e.getMessage());
 e.printStackTrace();
 System.exit(1);
 } catch (Exception e) {
 System.err.println("Exception: " + e.getMessage());
 e.printStackTrace();
 System.exit(1);
 }
 }

 }

}

不过,官方文档还说,"要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。"


解决方法二:

连接mysql时(无论在从mysql读还是取数据的情况),指定使用的编码方式为utf-8,具体代码如下

//装载mysql-jdbc驱动

Class.forName("com.mysql.jdbc.Driver").newInstance();

//连接数据库

Connection sqlCon = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test? user=root&password=1&useUnicode=true&characterEncoding=utf-8" );







charset 和 collation 有多个级别的设置:服务器级、数据库级、表级、列级和连接级

1.服务器级
查看设置:show global variables like 'character_set_server'; 和 show global variables like 'collation_server';
修改设置:在OPTION FILE (/etc/mysql/my.cnf)里设置:
[mysqld]
character_set_server=utf8
collation_server=utf8_general_ci

2. 数据库级
查看设置:select * from information_schema.schemata where schema_name = 'cookbook';
设置:
1.若没有显式设置,则自动使用服务器级的配置
2.显式设置:在创建库时指定
create database playUtf8 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

3.表级
查看设置:show create table course;
设置:
1.若没有显式设置,则自动使用数据库级的配置
2.显式设置:在创建表时指定
create table utf ( id int ) default charset=utf8 default collate=utf8_bin;

4.列级
查看设置:show create table course;
设置:
1.若没有显式设置,则自动使用表级的配置
2.显式设置:

CREATE TABLE Table1(column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci);

5.连接级别
查看设置:
show variables like 'character_set_client'; # 服务端使用这个编码来理解客户端发来的statements
show variables like 'character_set_connection' ; # 我还不知道什么意思,等看了mysql源码再说
show variables like 'character_set_results'; # 服务端使用这个编码回送结果集和错误信息
设置:
客户端在连接时可以指定这些参数;同时,服务端也提供了一个Global范围的值,客户端未指定这些参数时,服务端就使用这个Global值。这个global值怎么设置的? 我查遍了很多文档,似乎还没看到设置的办法 (有人说通过my.cnf,或者在启动mysqld时指定命令行参数,其实都是错的)



附:connector/j传输SQL时用什么编码?
答案: "The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server using the character_set_server system variable for server versions 4.1.0 and newer."
也就是说,是在连接时查询服务器端的character_set_server值,再确定连接将使用的编码。
不过,官方文档还说,"要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。"


解决方法二:

连接mysql时(无论在从mysql读还是取数据的情况),指定使用的编码方式为utf-8,具体代码如下

//装载mysql-jdbc驱动

Class.forName("com.mysql.jdbc.Driver").newInstance();

//连接数据库

Connection sqlCon = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test? user=root&password=1&useUnicode=true&characterEncoding=utf-8" );


文档

jdbcmysql中文乱码的解决方法

jdbcmysql中文乱码的解决方法:通过jdbc 连接mysql 数据库的实例,以及中文乱码的解决方法: import java.sql.*;/** * 使用JDBC连接数据库MySQL的过程: * DataBase: db_test * tables: tab_test; * username: user_test; * passwd: passwd_tes
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top