latin1 java_使用Java读写存储在latin1编码的MySQL中的UTF-8编码的中文
绝大多数情况下,一个项目中,都是使用同一套编码。如,全部使用UTF-8或者GBK。
但是当涉及到多个项目合并、新手加入等情况时,不可避免出现使用多套编码的情况。所有字符串都是英文的情况还好,若是出现了中文,就导致了乱码的出现。
下面以我碰到的问题的解决方案说明。
前置说明:
==============
Java MySQL
UTF-8 utf8
ISO-8859-1 latin1
==============
MySQL数据库使用latin1的编码,导入导出的数据是UTF-8编码的,即将MySQL当做一个透明的存储。
============================
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8
=============================
Java编写的导入数据程序(包括查看数据校验,即涉及到数据的导入导出)
C++编写的导出数据程序(仅涉及到数据的导出)
Java程序如何读写中文
第一种解决办法:
0 .Java文件设置为UTF-8编码(Eclipse的设置方法为:点击Window->Preferences->General->Workspace->Text file encoding->Other 填入UTF-8)
1 .设置URL参数characterEncoding为utf8。示例:jdbc:mysql://127.0.0.1:3306?characterEncoding=utf8
2 .所有的数据库连接在执行任何SQL语句之前,先执行SQL语句set names 'latin1'
3 .取数据时,需要从ISO-8859-1转码。本项目示例为:new String(rs.getString("SampleColumnName").getBytes("ISO-8859-1"), "UTF-8")
为什么这样解决?
0 .对于写在*.java文件中的中文,它的编码方式就是文件的编码方式,设置为UTF-8,即写在*.java文件中的中文编码方式为UTF-8;
1 .对于从JDBC驱动程序发往服务器的所有字符串,缺省情况下均将自动地从原生的Java Unicode形式转换为客户端字符编码。如果要转成特定编码,则需要设置characterEncoding,如要设置为UTF-8,则需要设置为characterEncoding=utf8
2 .set names 'latin1'主要是将以下三个字符集的编码方式改为latin1,即character_set_client、character_set_connection和character_set_results这三个的编码。当插入数据时,MySQL服务器把客户端传来的statement,从character_set_client字符集转换成character_set_connection字符集(除非字符串中有类似_latin1或者_utf8的字符集声明)。当查询数据时,character_set_results系统变量表明了服务器返回查询结果时使用的字符集。服务器返回的数据,有比如字段的值和元数据(例如字段名)。
由此,可以得出:
本项目中,SQL语句的编码是UTF-8;
URL参数characterEncoding设置的编码为SQL语句的编码;
在set names 'latin1'后,character_set_client为latin1,因此,JDBC会将SQL语句从UTF-8转化为latin1;
由于character_set_client和character_set_connection一致,所以MySQL服务器不做转换。
将SQL要求存储的数据存储在latin1的数据库中。
3 .取数据时,由于存储的数据和character_set_results的编码方式都为latin1,不做转码,取回后,由于显示中文要求UTF-8,所以需要转码为UTF-8。
但是,MySQL手册不建议我们这样使用。
第二种解决方法:
0 .Java文件设置为UTF-8编码
1 .设置URL参数characterEncoding为utf8。示例:jdbc:mysql://127.0.0.1:3306?characterEncoding=utf8
2 .所有SQL语句、尤其是含有中文的SQL语句都必须进行转码为ISO-8859-1。对于写在.java文件中的中文,由于文件是UTF-8编码的,转码示例如下:
String DesSql = new String(SrcSql.getBytes("UTF-8"), "ISO-8859-1");
3 .取数据时,需要从ISO-8859-1转码。本项目示例为:new String(rs.getString("SampleColumnName").getBytes("ISO-8859-1"), "UTF-8")
为什么这样解决?尤其是2 ,为什么可以代替set names 'latin1'?
2 .在没有设置set names 'latin1'的情况下,
============================
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
=============================
测试不使用set names和String转码时:
本项目中,SQL语句的编码是UTF-8;
URL参数characterEncoding设置的编码为SQL语句的编码;
由于没有set names 'latin1',character_set_client为utf-8,因此,JDBC会不会将SQL语句转码;
在传输SQL到MySQL后,由于传输的是utf-8的数据,存储到latin1是会报错的,测试结果如下:
=========================================================
java.sql.SQLException: Incorrect string value: '/xE4/xB8/xAD' for column 'SampleColumnName' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:734)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
=========================================================
编码问题,这样就走不下去了
只有将SQL中文更改编码。
String DesSql = new String(SrcSql.getBytes("UTF-8"), "ISO-8859-1");
这样,将已经转码为latin1的SQL(也不会被JDBC转码)传输给MySQL服务器,服务器正常接收和存储。
Over
latin1 java_使用Java读写存储在latin1编码的MySQL中的UTF-8编码的中文相关推荐
- 使用java语言操作,如何来实现MySQL中Blob字段的存取
/** * Title: BlobPros.java * Project: test * Description: 把图片存入mysql中的blob字段,并取出 * Call Module: mtoo ...
- latin1 java_从java查询latin1列
我想通过这样的标题进行查询: String title = "transfusión"; String sql = "SELECT id FROM graph WHERE ...
- mysql存储引擎查看语句,在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎...
在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎 答:SHOW VARIABLES; 名词解释:顾姑冠 答:蒙古族已婚妇女的首服,由帽子.冠体.披幅.系带.冠顶.羽毛五部分组 ...
- 文件输出 java_用Java读写文件(输入/输出)-教程
一.文件的Java I/O(输入/输出) 1.1.概述 在现代Java应用程序中,通常使用Java.nio.fileAPI来读写文件. Java将把所有输入作为字节流读取.input stream类是 ...
- mysql表格导入java_使用java技术将Excel表格内容导入mysql数据库
1.添加POI jar包到项目的lib目录下 2.Excel文件目录:d://excel.xls 3.数据库字段为:num1 num2 num3 num4 num5 num6 4.数据库名:bl ...
- 声明银行账户类 java_编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款...
查看本章节 查看作业目录 需求说明: 某用户共有两张银行卡,账户名称相同,但卡号和余额不同.模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细 实现思路: 项目中创建账户类 Account,类中 ...
- MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎 1.存储引擎其实就是如何实现存储数据 ...
- mysql中的存储机制_Mysql的存储引擎
MySQL的存储引擎存储引擎是什么?MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选 ...
- mysql latin1 utf8 java_Java读写以latin1编码存储以UTF-8输出的MySQL数据库(中文乱码)...
绝大多数情况下,一个项目中,都是使用同一套编码.如,全部使用UTF-8或者GBK. 但是当涉及到多个项目合并.新手加入等情况时,不可避免出现使用多套编码的情况.所有字符串都是英文的情况还好,若是出现了 ...
最新文章
- const成员或者引用成员必须使用构造函数初始化列表的方式
- [云炬python3玩转机器学习]5-10 更多关于线性回归的讨论
- 浅谈如何更好的打开和关闭ADO.NET连接池
- html网页大小自动调整大小,根据电脑屏幕分辩率大小自动调整网页宽度
- Online Learning算法理论与实践
- 【MyBatis】Mybatis使用SqlSessionFactory加载xml文件
- CPU合并写缓冲区简介
- [转载] 晓说——第23期:大师照亮八十年代
- 工程实践中最常用的10大数据结构与算法讲解
- 波形捕捉:(3)捕捉设备性能
- “钱景”没了?莫慌,内容创业还有七大红利
- 分享谷歌SEO的32个实用关键词拓展工具
- java静态池_java 常量池静态变量详解
- 监督学习-分类模型1-线性分类器(Linear Classifiers)
- 【菜单式爬虫】八爪鱼爬虫笔记
- javaweb基础:JSP第一篇 -----简单聊jsp是什么,其指令以及脚本使用
- 变点理论CUSUM在择时交易中的应用
- postgresql安装报错
- 通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺
- 【MySQL】MySQL 存储引擎、索引、锁、集群