V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
linuxsteam
V2EX  ›  问与答

为什么打包为可执行 jar,部分 SQL 语句就会乱码?

  •  
  •   linuxsteam · 2018-08-06 09:33:45 +08:00 · 1555 次点击
    这是一个创建于 2301 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情景:最近在做一个处理大文本,导入到 SQL 的一个小工具。但是出于其他同事电脑,没有 JDK,所以只能画个 Swing 打包成带 jdk 的 exe 文件给他们用.

    • 之前用 IDEA 打包为 Jar 用命令行运行 没有此问题( java 项目)
    • 在 Netbean 直接运行没有此问题 (swing 项目)

    然而打包好 jar 运行就有问题。(swing 项目)

    环境:JDK1.8,MYSQL5.7,WIN10,Netbean8.2

    问题代码:

    报错截图:

    报错:java.sql.BatchUpdateException: Invalid utf8 character string: '\xB4\xF3\xBB\xB0\xB5\xA5\xC8\xAB\xCA\xA1201807'

    乱码文字应该为:大话单 201807 (tableName)

    经过以下尝试,都无效,不知道怎么办了。所以求助,解决了也方便后人查阅(我自己也会整理)

    1. jdbc characterEncoding 换过 utf8mb4,gbk 依旧报错
    2. 换数据库编码为 gbk 依旧报错
    3. 更改项目编码为 gbk 依旧报错
    4. 反编译打包后的 jar 中的文件也没有乱码现象 ...(排除编译器原因)

    最重要的是!! sql1 建表语句用同样的 tableName 却不乱码(即不出现四字节情况\xB4 )。

    14 条回复    2018-08-08 12:16:17 +08:00
    wxyz
        1
    wxyz  
       2018-08-06 09:59:13 +08:00
    java -fileencoding=utf-8 试下
    execute
        2
    execute  
       2018-08-06 09:59:52 +08:00
    你第一点提到了“ jdbc characterEncoding 换过 utf8mb4 ”这步操作,但是你在 sql 里面却又指定了 character set utf8,不矛盾吗?
    wxyz
        3
    wxyz  
       2018-08-06 10:00:07 +08:00   ❤️ 1
    上面不专业,其实是-Dfile.encoding=UTF-8
    alvinbone88
        4
    alvinbone88  
       2018-08-06 10:10:17 +08:00
    数据库的编码确定是 utf8mb4_unicode_ci / utf8mb4_unicode_520_ci?MySQL 里 utf8mb4 有好几十种编码
    linuxsteam
        5
    linuxsteam  
    OP
       2018-08-06 12:31:56 +08:00
    @execute 之前我没有指定 character set 的 也就是默认创建的就是数据库的编码格式 即 utf8mb4
    mmdsun
        6
    mmdsun  
       2018-08-06 12:36:27 +08:00 via Android
    win10 可以改 cmd 的编码。你把 cmd 编码换成 utf-8
    linuxsteam
        7
    linuxsteam  
    OP
       2018-08-06 12:45:27 +08:00
    @alvinbone88 utf8mb4_general_ci navicat 默认修改字符集 排序规则都是 general 的
    linuxsteam
        8
    linuxsteam  
    OP
       2018-08-06 12:53:25 +08:00
    @wxyz 这个是在 cmd 里面添加吗 我试了还那样,无论您一楼的还是 3 楼的
    linuxsteam
        9
    linuxsteam  
    OP
       2018-08-06 13:00:09 +08:00
    @wxyz 卧槽,三楼参数放前面就可以了 java -jar -Dfile.encoding=UTF-8 xxx.jar 那这个可以在双击运行的时候内置进去吗? 要不然 exe 没法加这样的参数啊
    linuxsteam
        10
    linuxsteam  
    OP
       2018-08-06 13:13:05 +08:00
    @wxyz 刚刚又了解了一下该参数 就是指定 jvm 编码,windows 默认编码不是 gbk 吗,那我把项目改成 gbk 应该是可以解决问题的丫。。。。但是然并卵了。。。
    wxyz
        11
    wxyz  
       2018-08-07 08:32:20 +08:00
    要把文件的转码成 gbk,才是真正的 gbk,这个是-D 是配置系统变量的,可以在程序里设置,有些地方你用了默认编码,就用的这个值。
    x18960
        12
    x18960  
       2018-08-07 14:11:28 +08:00 via Android
    @wxyz 这个在 windows 环境变量里面能设置一下吗?
    wxyz
        13
    wxyz  
       2018-08-08 10:03:17 +08:00
    @x18960 应该不行吧,一个是环境变量,一个是系统变量
    x18960
        14
    x18960  
       2018-08-08 12:16:17 +08:00 via Android
    @wxyz 谢谢大佬
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.