【刨根问底】数据库插入数据时报 incorrect string value for column 异常,如何破?

一、软件版本

  • OS: Windows Server 2012 R2 标准版 64位版
  • JDK: JDK8
  • MySQL: 5.7.31
  • 命令行工具:PowerShell

二、 BUG背景

在记录异常日志时,系统报 incorrect string value for column异常,一般情况下这个就是数据库字符集的问题。

查看数据库表字符集的命令。

show full columns from [table]

OK,那就尝试修改一下,看一下结果,发生异常的是日志表里的exception_detail字段,使用上述命令查看其原字符集是UTF-8,使用下述命令将其修改为utf8mb4,依旧报错。

ALTER TABLE `sys_log`
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci

那就排除这个修改项。

还有一种原因是,Tomcat编码和数据库编码不一致,WindowsTomcat默认编码为gbk,若数据库编码为utf-8,会导致中文无法插入。

因此,需要在Tomcat启动参数中,虚拟机参数增加-Dfile.encoding=UTF-8

三、使用PowerShell和cmd启动jar包

注意同样的命令, 如java -jar -Dxxx=xx,在PowerShell和在cmd中运行结果是不同的。

如,在cmd中,直接运行 java -Dfile.encoding=utf-8 -jar xxx.jar完成程序执行。

但是在PowerShell中,参数必须加引号,运行 java '-Dfile.encoding=utf-8' -jar xxx.jar完成程序执行。如果不加引号,报加载不了主类

四、最佳实践

强烈推荐,在执行java程序时,参数部分,后续统一要求带文件的的编码方式。

 java  '-Dfile.encoding=utf-8' -jar xxx.jar