-
2021-12-30 11:47:06
问题:
mysql表示utf8编码,写入的中文是Latin1编码,即读取中文之前需要先执行set names latin1,中文显示才不乱码。
java读取这种情形的中文怎么保证不乱码?
1、jdbc-url=jdbc:mysql://{ip}:3306/spring?characterEncoding=utf8
说明:jdbc的url字符集指定为utf8
2、在执行sql查询前先执行
set names latin1
如果用jdbctemplate,代码如下:
jdbcTemplate.execute("set names latin1");
3、获取的数据转换
ResultSet rs;
byte[] bval = rs.getBytes(i);//获取字段对应比特数组
String val = "";
val = new String(bval, "UTF-8");//将比特数组转换为utf8字符串
val中含有中文将会正常显示。
完毕~
更多相关内容 -
Latin1是什么编码是ISO-8859-1的别名
2012-07-21 11:26:08Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。 ISO-8859-1 ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF...atin1
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
ISO-8859-1
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。
而gb2312是标准中文字符集。
UTF-8 是 UNICODE 的一种变长字符编码,即 RFC 3629。简单的说——大字符集。可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
对系统来讲,UTF-8 编码可以通过屏蔽位和移位操作快速读写,排序更加容易。UTF-8 是字节顺序无关的,它的字节顺序在所有系统中都是一样的。因此 UTF-8 具有更高的性能。
不过如果是纯英文的话,用什么都可以,用GB2312也没问题。 -
mysql的latin1编码支持中文吗?
2021-01-25 19:58:55初学者往往会犯糊涂,mysql 的默认字符集 latin1 是否支持中文?初步分析表明,是的,确实支持中文!...ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80...初学者往往会犯糊涂,mysql 的默认字符集 latin1 是否支持中文?
初步分析表明,是的,确实支持中文!(是初步的结论,只做了初步的分析)
1. 先来看看latin1 (参考百度百科)
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
2. 稍微再想想字符集
是的,不用纠结太多了,如果数据库内表的字符集是latin1,那么默认情况下中文也可被支持!
· latin1覆盖了所有单字节的值,任何其他的码流都可以被看做latin1
· 把一个gbk编码的串写入latin1的表,不会有任何问题,保存的是原封不动的字节流
· 从表中读取已写入的串也不会有任何问题,且读出的字节流就和当初写入的完全一致
读取出来以后,如果在终端下,就会理解成locale类型(如果locale系gbk,当时写入的gbk中文串可正常回显)
读取出来以后,如果要写入文件,则文件编码方式即当时写入的字节流编码,如gbk写入的,读出存入文件后,文件编码也是gbk!但是如果混着写(utf-8 + gbk),那编辑器就犯蒙了,就可能会显示会有乱码。
注: 纯文本文件大多无文件头,编辑器是通过字节流自己识别编码方式和字符集的
3. 综上,建DB和访问DB时如果都采用默认的latin1,那就不仅仅支持中文,而是支持任意的编码方式!
附送几个数据库中文编码的经验教训:
1. 基于可维护的角度,虽然latin1没什么问题,但是还是尽量换成utf8或者gb系列
2. 出现乱码时:
SHOW VARIABLES LIKE 'character%'
SHOW VARIABLES LIKE 'collation_%';
a、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
b、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;
c、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
d、要保证程序编码与浏览器、终端编码一致
3. 要想简单一点的话,就将各个字符集都设为一致的,写入mysql的配置文件,每次用客户端都设置一下字符集(set names 'xxx'),写入和读取时要记得确保字节流的编码是ok的
笔者近期遇到一个问题,latin1保存汉字导致不同汉字被认为相等的问题,例如“冷梦"与"冷渺"相等
SHOW VARIABLES LIKE '%coll%';
collation_connection latin1_swedish_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci
latin1_swedish_ci是忽略大小写的,改为
select * from tblCharacter where fldCharName = ('冷梦' COLLATE latin1_bin)
即可解决。
from http://blog.chinaunix.net/uid-24098129-id-312645.html
http://blog.csdn.net/qiuyepiaoling/article/details/6956823
-
latin1-to-utf8:将文件从 ISO-8859-1 (latin1) 重新编码为 UTF8 的实用程序,但不会弄乱已经以 UTF8 编码的...
2021-07-01 18:58:30l1u8recode 是一个简单的实用程序,用于将文件从 ISO-8859-1 (latin1) 重新编码为支持混合编码和/或格式的 UTF8。 它能够处理这两种特殊情况: 重新编码可以应用于输入的分隔部分。 适用于包含文本和二进制数据的... -
ISO-8859-1 、Latin-1 西欧编码介绍及应用
2020-10-22 04:44:22主要介绍了ISO-8859-1 、Latin-1 西欧编码介绍及应用,需要的朋友可以参考下 -
记一次数据库为latin1编码查询中文乱码问题处理
2020-12-21 17:28:00因项目需求,需要整合多个项目一起,其中一个项目因在创建数据库的时候没有设置编码格式,为默认的latin1编码。这就导致查询遇到中文的时候会出现乱码,需要进行转码操作。 二、问题处理过程(本项目为springboot+...以下是个人项目中采用的方法,应该还有其他更有优雅完善的方式。这里先记录下,后面碰到就可以很快填坑了
一、问题描述:
因项目需求,需要整合多个项目一起,其中一个项目因在创建数据库的时候没有设置编码格式,为默认的latin1编码。这就导致查询遇到中文的时候会出现乱码,需要进行转码操作。二、问题处理过程(本项目为springboot+mybatis):
1、经过多次验证,发现原来数据库的插入数据格式为gbk,然而数据库编码为latin1格式的。网上给出的方案大部分是备份库,然后重新调整数据库编码格式什么的。实际情况,首先风险不说,大部分情况是不允许这么操作,如涉及到别的项目对这个已经进行过处理,如果改变了编码,也许自己项目没有问题,但也会导致别的用这个库的项目受到影响。
2、设置项
2.1、多数据源配置(注意加粗的地方,然后url中characterEncoding的编码格式根据实际需要设置,如果原来库中是gbk就设置为gbk):spring: datasource: db1: #jdbc-url: jdbc:mysql://host:3306/db1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai url: jdbc:mysql://host:3306/db1?useUnicode=true&characterEncoding=gbk&serverTimezone=Asia/Shanghai username: root password: *** # 驱动 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver mybatis: type-aliases-package: com.saas.mall.jz.rmi.dao.admin #设置连接指定编码配置项 connectionInitSqls: set names latin1 db2: #jdbc-url: jdbc:mysql://host:3306/db2?useUnicode=true&characterEncoding=gbk&serverTimezone=Asia/Shanghai url: jdbc:mysql://host:3306/db2?useUnicode=true&characterEncoding=gbk&serverTimezone=Asia/Shanghai username: root password: *** # 驱动 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver mybatis: type-aliases-package: com.saas.mall.jz.rmi.dao.website connectionInitSqls: set names latin1 db3: url: jdbc:mysql://host:3306/db3?useUnicode=true&characterEncoding=gbk&serverTimezone=Asia/Shanghai username: root password: **** # 驱动 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver mybatis: type-aliases-package: com.saas.mall.jz.rmi.dao.evyun connectionInitSqls: set names latin1
2.2、 java配置项(多数据源需要配置,单数据源只需要配置文件中配置相应项就可以,下面为其中一个数据源的配置,注意DataSource需要是DruidDataSourceBuilder的,只有druid的数据源connectionInitSqls的配置才有用):
package com.saas.mall.jz.rmi.config; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; /** * @Description: admin数据库数据源配置 * @Creater: sunxiang * @CreateTime: 2020年12月21日 下午 14:10 **/ @Configuration @MapperScan(basePackages = "com.saas.mall.jz.rmi.dao.admin.mapper", sqlSessionFactoryRef = "adminSqlSessionFactory") public class DataSourceAdminConfig { @Bean("adminDataSource") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource getDb1DataSource(){ //注意是DruidDataSourceBuilder 而不是DataSourceBuilder,后者的话设置无效 return DruidDataSourceBuilder.create().build(); } @Bean("adminSqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("adminDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:sqlMapper/admin/*.xml")); return bean.getObject(); } @Bean("adminSqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("adminSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
通过上面的配置,再插入和修改数据的时候在执行具体sql语句之前会将连接编码设置为 latin1格式的,保证与数据库编码一致。重点是配置文件中:connectionInitSqls: set names latin1 这个配置。具体作用自行百度下就知道了。这样就解决了插入数据的问题。
2.3、获取数据:
如果不做任何处理在获取数据的时候也会有乱码,因为查出来的为latin1编码格式。指导思路是对该编码转换,我的想法是:String s = new String(params.getBytes("ISO-8859-1"), "gbk");
上述语句中 params为乱码的字段名。
其中利用了mybatis的拦截器对所有的进行拦截处理:package com.saas.mall.jz.rmi.filter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.saas.mall.jz.rmi.util.BeanCopyUtil; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.*; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; @Component //拦截Executor类的query方法 @Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})}) public class MybatisInterceptor implements Interceptor { @SuppressWarnings({"rawtypes", "unchecked"}) public Object intercept(Invocation invocation) throws Throwable { Object result = invocation.proceed(); //执行请求方法,并将所得结果保存到result中 if (result instanceof ArrayList) { List list = new ArrayList(); ArrayList resultList = (ArrayList) result; for (int i = 0; i < resultList.size(); i++) { Object object = resultList.get(i); if (object instanceof Integer || object instanceof Long) { list.add(object); } else { Class<?> aClass = object.getClass(); //对object进行转码,然后重新赋值返回,如果其他类型需要自行根据实际情况进行处理,ISO-8859-1对应的即为latin1编码 String s = new String(JSONObject.toJSONString(object).getBytes("ISO-8859-1"), "gbk"); Object object1 = JSONObject.toJavaObject(JSON.parseObject(s), aClass); list.add(object1); } } return list; } return result; } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties arg0) { } }
注入上面的拦截器使生效:
import com.saas.mall.jz.rmi.filter.MybatisInterceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.List; import java.util.Properties; @Configuration public class MyBatisConfig { @Autowired private List<SqlSessionFactory> sqlSessionFactoryList; @PostConstruct public void addMySqlInterceptor() { //自己定义的插件拦截器类,注入到sqlSessionFactory配置中 MybatisInterceptor interceptor = new MybatisInterceptor(); for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) { sqlSessionFactory.getConfiguration().addInterceptor(interceptor); } } }
上面的操作就完美实现插入和查询的中文乱码问题。
-
ASCII,Latin1,Unicode,UTF-8与GBK编码的区别
2019-01-30 14:59:54ASCII编码采用单字节(8 Bit)存储,实际数据存储空间是7 Bit,最高位的1 Bit是奇偶校验位。 ASCII编码对于英语国家足够用了,但是却无法表达非英语国家字符到计算机编码之间的映射,如中文汉字、法语字母等。所以,... -
python-latin1-to-utf8:将错误的 Latin-1 字符转换为 UTF-8 字符
2021-07-18 21:50:28python-latin1-to-utf8 将错误的 Latin-1 字符转换为 UTF-8 字符。 是对编码问题的全面描述和解释。 用法 $ python latin1-to-utf8.py Automática > Automática 相关项目 -
python 可能出现的编码问题(latin-1,ascii报错)
2019-05-20 17:34:16尽量全部使用英文输出,因为你不知道服务器会出现什么样的编码问题。 1. UnicodeEncodeError: 'latin-1' codec can't encode characters in position 9-13: ordinal not in range(256) 类似这种的问题一般是中文编码... -
MySQL编码latin1转utf8
2021-01-18 20:08:40mysql的缺省字符集是 latin1,在使用mysql4.x的时候,很多人都是用的latin1字符集。而当使用mysql5时往往愿意使用utf8。那么我们的任务是不是要 把数据中的字符从latin1转为utf8呢?不是的。用一句不大准确,但又... -
mysql编码转换 latin1编码向utf-8转换
2021-01-19 03:41:56若有发生这种情况,是因为虽然mysql本身及网页都是utf-8,但是xoops却用latin1将数据传给mysql,因此最后是utf-8数据被以latin1的格式储存进资料库。其实在xoops来看没有任何问题,只是用phpmyadmin看时,就都是乱码... -
各种编码格式的区别:ASCII,Latin1,Unicode,UTF-8与GBK
2021-03-23 17:35:142.Latin1编码 3.Unicode编码 4.UTF-8编码 5. GBK编码 1.ASCII编码 ASCII码实现的是大小写英文字母,阿拉伯数字,及常用的标点符、运算符、控制字符(换行、删除等)和通信字符(文头、确认等)与计算机编码之间的... -
mysql数据表latin1编码导致中文乱码问题
2021-01-05 17:56:25前几天一位朋友使用wordpress搭建的个人网站升级。升级完后页面内容全部变成了乱码。...修改了表的编码格式,但有一些字段比如text仍然是使用Latin1编码的。使用上面的命令可以看字段的编码格式。 show crea -
latin1编码
2015-08-31 09:45:04Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。 ISO... -
ASCII, LATIN1, UTF8 简介
2015-11-17 09:44:59ASCII, LATIN1, UTF8 简介 ASCII-American Standard Code for Information Interchange · Character repertoire: ASCII 严格来讲就是7个bit大小的字符集,也就是codepoint介于0-127之间的字符集合。 · ... -
编码ascii,latin1,utf8,gbk
2013-07-25 09:50:05早期的字符集编码,使用1个字节的后7位可以表示128个字符 分别是:大小写字母,数字,标点符号,非打印字符及控制符. Latin1 ISO 8859-1 Latin1 扩展欧洲语言 使用128-255表示拉丁字符中的特殊字符. Unicode 支持欧洲,... -
Latin1编码的中文 - HTML Escape在老系统全球化的应用体验
2017-11-12 09:16:38这个老系统最早只是考虑了欧美市场,所以数据库是Latin1的编码,而后来的亚太市场则采用了UTF8的存储编码。A国被安置在了亚太的技术栈,所以数据是UTF8的。 虽然存储在各国不同,但是访问存储的客户端代码是一个包... -
解决数据库编码为latin1时,navicat for mysql中文乱码问题
2018-11-06 12:53:57数据库字符集为latin1时,navicat for mysq中打开该数据库出现中文乱码,解决办法: 右键点击 数据库服务器,选择“连接属性…”,在连接属性弹窗中选择“高级”页签,去掉‘使用MySQL字符集’勾选项,编码处选择... -
不同子系统采用不同MySQL编码LATIN1和UTF8的兼容
2021-01-19 02:23:26程序处理这是一个历史遗留系统, 旧的系统是C++开发的, 插入数据的时候, 没有统一MYSQL各个层次(服务器, 数据库, 表, 列)的编码, 这个情况基本上是MYSQL的默认安装导致的, 实际的数据编码为LATIN1, 而采用Java 开发的... -
ASCII &Latin-1字符编码表
2009-11-19 11:14:300000-00ff之间的字符编码,方便查阅,很好的资料。 -
MySQL8 与 C# latin1转UTF8 编码乱码 解决方式
2021-01-11 13:35:43MySQL 的 latin1 编码, 不是ISO-8859-1编码。 可以使用下列方式进行转换 Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(Message); byte... -
MySQL latin1字符集PHP读取中文乱码解决方案
2021-04-28 05:01:03此方法针对latin1编码存储数据的数据库(插入的数据编码格式未知)。使用php读出数据,需要加入mysql_query(“SET NAMES ‘LATIN1′”)此时会发现latin1输出的中文乱码在页面显示已经可以正常(页面的编码是gbk,这时... -
mysql的latin1字符集支持所有字符集
2021-01-25 19:02:431. 先来看看latin1 (参考百度百科)Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符... -
mysql latin1 支持中文吗
2021-01-19 04:16:16展开全部mysqllatin1数据库支持中文编码。ISO-8859-1编码是单字节编码,向下兼容ASCII,其e5a48de588b662616964757a686964616f31333433633432编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F... -
Python:从ISO-8859-1 / latin1转换为UTF-8
2021-05-19 06:29:17对于非unicode字符串(u例如u'\xc4pple',没有前缀的字符串),必须将本机编码(iso8859-1/ latin1,除非使用enigmaticsys.setdefaultencoding函数进行修改)解码为unicode,然后编码为可以显示所需字符的字符集,在这种... -
mysql 数据库 latin1 导致的乱码
2021-01-19 00:04:04mysql 这货,默认的编码是 latin1 (例如 latin1_swedish_ci)。——实在不明白为什么是这样。而最近10年,主流的编码方式已经是 utf8 。mysql 中,最初采用 utf8_generalci 与其匹配,后来逐渐地使用 utf8unicode_ci ... -
原数据库Latin1编码,导入到新数据库utf8编码踩的坑
2018-05-01 21:35:241.需求:原数据latin1编码,要取数据到测试服务器,不想用原来的latin1编码了。2.操作: a.公司同事,把导出来的latin1编码的数据库导出文件给我,中文一堆乱码,乱码是这样的 猫“抓抓â€çš„... -
linux下 vim 打开中文乱码latin1
2021-05-08 21:18:48:edit ++enc=utf-8[zz]http://blog.sina.com.cn/s/blog_8f398540010158fh.html最后来看看处理中文文档最典型的几种情况和设置方式:1,系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK... -
mysql移置之将latin1编码更换为utf-8编码
2017-06-26 17:21:06mysql移置之将latin1编码更换为utf-8编码 由 ADMIN · 发布日期 2011年05月23日 · 已更新 2011年09月5日 mysql移植含有中文的数据时,很容易出现乱码问题。很多是在从mysql4.x向mysql5.x...