V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
linuxsteam
V2EX  ›  问与答

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

  •  
  •   linuxsteam · Aug 6, 2018 · 1957 views
    This topic created in 2828 days ago, the information mentioned may be changed or developed.

    情景:最近在做一个处理大文本,导入到 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 replies    2018-08-08 12:16:17 +08:00
    wxyz
        1
    wxyz  
       Aug 6, 2018
    java -fileencoding=utf-8 试下
    execute
        2
    execute  
       Aug 6, 2018
    你第一点提到了“ jdbc characterEncoding 换过 utf8mb4 ”这步操作,但是你在 sql 里面却又指定了 character set utf8,不矛盾吗?
    wxyz
        3
    wxyz  
       Aug 6, 2018   ❤️ 1
    上面不专业,其实是-Dfile.encoding=UTF-8
    alvinbone88
        4
    alvinbone88  
       Aug 6, 2018
    数据库的编码确定是 utf8mb4_unicode_ci / utf8mb4_unicode_520_ci?MySQL 里 utf8mb4 有好几十种编码
    linuxsteam
        5
    linuxsteam  
    OP
       Aug 6, 2018
    @execute 之前我没有指定 character set 的 也就是默认创建的就是数据库的编码格式 即 utf8mb4
    mmdsun
        6
    mmdsun  
       Aug 6, 2018 via Android
    win10 可以改 cmd 的编码。你把 cmd 编码换成 utf-8
    linuxsteam
        7
    linuxsteam  
    OP
       Aug 6, 2018
    @alvinbone88 utf8mb4_general_ci navicat 默认修改字符集 排序规则都是 general 的
    linuxsteam
        8
    linuxsteam  
    OP
       Aug 6, 2018
    @wxyz 这个是在 cmd 里面添加吗 我试了还那样,无论您一楼的还是 3 楼的
    linuxsteam
        9
    linuxsteam  
    OP
       Aug 6, 2018
    @wxyz 卧槽,三楼参数放前面就可以了 java -jar -Dfile.encoding=UTF-8 xxx.jar 那这个可以在双击运行的时候内置进去吗? 要不然 exe 没法加这样的参数啊
    linuxsteam
        10
    linuxsteam  
    OP
       Aug 6, 2018
    @wxyz 刚刚又了解了一下该参数 就是指定 jvm 编码,windows 默认编码不是 gbk 吗,那我把项目改成 gbk 应该是可以解决问题的丫。。。。但是然并卵了。。。
    wxyz
        11
    wxyz  
       Aug 7, 2018
    要把文件的转码成 gbk,才是真正的 gbk,这个是-D 是配置系统变量的,可以在程序里设置,有些地方你用了默认编码,就用的这个值。
    x18960
        12
    x18960  
       Aug 7, 2018 via Android
    @wxyz 这个在 windows 环境变量里面能设置一下吗?
    wxyz
        13
    wxyz  
       Aug 8, 2018
    @x18960 应该不行吧,一个是环境变量,一个是系统变量
    x18960
        14
    x18960  
       Aug 8, 2018 via Android
    @wxyz 谢谢大佬
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2707 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 13:13 · PVG 21:13 · LAX 06:13 · JFK 09:13
    ♥ Do have faith in what you're doing.