Linux与Windows系统字符集的简要学习

linux,windows,系统,字符集,简要,学习 · 浏览次数 : 197

小编点评

**问题现象:** * 更新后,部分 MySQL 8.0.31 驱动jar包部分功能报错。 **问题核心原因:** * MySQL 8.0.26 及更高版本之后的数据库驱动似乎会识别操作系统的编码格式,导致序列化与反序列化问题。 **解决方案:** * 使用 `-Dfile.encoding=UTF-8` 参数启动脚本增加编码格式,例如: ```bash nohup ./startup-linux.sh >locale_gbk_startup.log & ``` * 降级 MySQL 驱动版本至 8.0.23,该版本支持 UTF-8 字符集。 **其他建议:** * 检查数据库的字符集和列的字符集,确保与驱动版本兼容。 * 尝试修改 Linux 系统的编码格式,例如 `export LANG=zh_CN.GBKEOF`。 * 使用 `cat >/etc/profile.d/gbk.sh <<EOF` 等命令增加编码格式。

正文

背景

最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错.
问题核心原因 研发这边石磊老师已经找到了. 
结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的编码格式.
进而会导致尤其是stringbuilder等对象的序列化与反序列化的问题. 
这里想简单复盘一下. 加强对编码格式的学习和了解. 

问题现象

最开始的数据库驱动版本是 mysql-8.0.23
最近为了安全与性能升级到 mysql-8.0.31

大部分功能没问题. linux系统下也么有问题. 
但是Windows系统下面的程序就报错了. 

查过表的字符集, 数据库的字符集, 甚至是列的字符集都没有问题
show full columns from table_name
均是符合要求的utf8mb3字符集
(知道utf8mb4,但是产品有他的局限性.)

问题解决

可以使用 启动脚本增加 -Dfile.encoding=UTF-8
或者是 降级Mysql的驱动到 8.0.23 就可以. 

问题推测

获取系统的编码格式:
Windows: chcp
Linux:   local
注意: 活动代码页 936 代表的就是GBK编码格式
很多解压缩会出现乱码需要使用
unzip -O CP936 xxxx.zip 的核心原理是一样的
CP 的含义就是code page

需要注意的一点是:
Windows诞生的比utf8编码格式要早很多.
他的国际化也一直沿用了比较早的语言编码格式.

Linux诞生的比Windows和utf8都要晚很多.
所以Linux很多默认的编码格式都是utf-8的

Linux再现问题

尝试修改Linux系统的编码格式.
网上的很多办法都不太好用. 
我这边的方式为:
cat >/etc/profile.d/gbk.sh <<EOF
export LANG=zh_CN.GBK
EOF
source /etc/profile.d/gbk.sh

然后系统内验证一下 locale得出的结果为:

[root@centos7ver2009 myapp]# locale
LANG=zh_CN.GBK
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=

然后在这个shell上面启动服务进行验证. 
nohup ./startup-linux.sh >locale_gbk_startup.log &

问题确认

导致具体问题的原因不是很清楚.
但是发现跟数据库版本.和系统版本其实关系不大.
只不过因为默认的系统编码格式不一致导致了问题. 

编码格式,时区,字符集,字体 其实都很关键.
有差异都会导致产品出现不一致的情况. 

与Linux与Windows系统字符集的简要学习相似的内容:

Linux与Windows系统字符集的简要学习

背景 最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错. 问题核心原因 研发这边石磊老师已经找到了. 结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的编码格式. 进而会导致尤其是stringbuilder等对象的序列化与反序列化的问题. 这里想简单复

[转帖]静态路由实例:如何在 macOS、FreeBSD、Linux、Windows、Cisco 和 VMware 上添加静态路由

https://sysin.org/blog/static-routing/ 学习一下呢. 本文描述主流系统和产品添加静态路由的方法,一些具备 WEB 管理界面的产品不在讨论范围,比如防火墙、路由器等多数产品具备直观的操作界面。 macOS 1、添加路由命令(临时) 与 Linux 类似,但是网关没

Windows平台文件拆分与完整性检查的过程

# Windows平台文件拆分与完整性检查的过程 ## 场景 ``` 有时候在没有linux主机的情况下, 自己下载下来的文件比较大. 比较难以上传到一些特殊的系统/主机上面. 这个时候需要将文件进行拆分. 所以可以通过winrar 或者是zip等工具进行打包切分 但是一方面,压缩,解压缩表费时费力

[转帖]IvorySQL--Linux环境源码编译安装

https://www.ivorysql.org/zh-CN/blog/IvorySQL-Linux IvorySQL可以在Linux, OSX, Unix和Windows平台上构建,与PostgreSQL的编译安装基本上是一样的。本文对基于Linux的系统上编译源代码的步骤进行说明。 一、准备工作

windows10 docker desktop与本机数据拷贝

前景提示 发现只有docker关于docker拷贝linux内部文件的命令,但是,对于window系统就没有相关的答案,因此经过研究找了一个处理的方法。 一、构建环境 | 序号 | 软件 | 相关文章 | | | : : | | | 1 | Docker | https://www.cnblogs.

top的简单学习

获取当前进程的全部线程 jps 获取jvm的进程信息. top -Hp $pid -bn 1 > 1.txt 可以获取当前特定进程的所有子进程. 注意linux与Windows的不太一样. linux下面的线程实现,其实是子进程的模式. Windows的更是process-thread的映射模式.

[转帖]sqlserver on linux vs windows

简单对比下sqlserver on windows与linux的特点,发现新的继续添加 对比项sqlserver on windowssqlserver on Linux备注费用需要windows license开源,可使用免费的OS 功能齐全,企业版包含所有功能较少,企业版功能也不齐全 安装包大小

[转帖]认识目标文件的格式——a.out COFF PE ELF

https://cloud.tencent.com/developer/article/1446849 1.目标文件的常用格式 目标文件是源代码编译后未进行链接的中间文件(Windows的.obj和Linux的.o),与可执行文件(Windows的.exe和Linux的ELF)的结构和内容相似,因此

[转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)

https://www.jianshu.com/p/fd46652f247e 摘要:Linux,crontab整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志 crontab简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任

人大金仓学习之一_kwr的简单学习

# 人大金仓学习之一_kwr的简单学习 ## 摘要 ``` 周末在家想着学习一下数据库相关的内容. 网上找了不少资料, 想着直接在本地机器上面进行一下安装与验证 理论上linux上面应该更加简单. windows 上面可能不如linux方便 主要是记录一下使用和注意事项. ``` ## ISO下载