不同子系统采用不同MySQL编码LATIN1和UTF8的兼容
2023-09-27 14:26:43 时间
程序处理
这是一个历史遗留系统, 旧的系统是C++开发的, 插入数据的时候, 没有统一MYSQL各个层次(服务器, 数据库, 表, 列)的编码, 这个情况基本上是MYSQL的默认安装导致的, 实际的数据编码为LATIN1, 而采用Java 开发的新的系统需要和这个遗留系统公用数据库, 采用的是UTF8编码, 碰到的问题是Java代码中获取到的中文为乱码.
搞清楚了这个问题, Java中把乱码转换为正常显示的UTF8编码的中文很简单, 下面是转换代码
/**
* LATIN1转UTF8
*
* @param latin1 LATIN1(ISO_8859_1)字符串
* @return UTF8字符串
*/
public String encodingConvert(String latin1) {
return new String(
latin1.getBytes(StandardCharsets.ISO_8859_1),
StandardCharsets.UTF_8
);
}
这是使用程序代码的处理方式, 有的时候我们需要直接从SQL返回的结果集中直接拿到UTF8的数据, 看下面
SQL内置函数转换
上面通过程序代码可以处理字符集的转换, 下面通过SQL的方式转换
CONVERT和CAST函数: 首先需要把LATIN1的转为BINARY, 然后再把BINARY转为UTF8``` SELECT USER.USERID AS USERID, USER.NICKNAME AS NICKNAME_LATIN1, CONVERT ( CAST( CONVERT ( USER.NICKNAME USING latin1 ) AS BINARY ) USING utf8 ) AS NICKNAME_UTF8 FROM USER WHERE USERID = 15889; ```
其中 LATIN1_COLUMN 是LATIN1 编码的字符集
最后, 我们可以把这样的转换做成一张视图, 程序就不用再转换了.
``` CREATE VIEW V_USER AS SELECT USER.USERID AS USERID, CONVERT ( CAST( CONVERT ( USER.NICKNAME USING latin1 ) AS BINARY ) USING utf8 ) AS NICKNAME FROM USER; ```相关文章
- 网易一面:select分页要调优100倍,说说你的思路?(内含Mysql的36军规)
- mysql 查询优化执行过程
- python通过ssh连接mysql数据库的注意事项
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
- 改变mysql客户端输出的字符串编码
- mysql 手册关于修改列字符编码的一个bug
- 《PHP、MySQL和Apache入门经典(第5版)》一导读
- 把mysql编码改成utf8
- 浅析Linux如何安装MySQL及遇到的问题
- Django框架数据库(mysql)存储时间DateTimeField的用法
- MySQL数据库如何做好优化
- mysql 修改编码格式
- mysql 获取所有的数据库名字