实在想不好这个标题该怎么写,就这么着吧。
事件还原
项目是用java+mysql开发的,用innosetup打成exe,jdk,tomcat,mysql都在里边了,mysql毕竟还是有点重,对于一些单机应用的,用h2完全足够了,就又打了个h2的版本,安装过程需要对更改数据库密码,并对数据库内容进行初始化(要执行一些sql),按照原来打mysql的思路,需要生成一个sql,然后用命令执行一下。sql文件可以正常生成,调用h2命令行的时候没成功,调用的类是org.h2.tools.RunScript,这是h2专门用来执行sql文件的一个类,后来把sql文件直接在命令行下跑了下,发现有乱码,通过文件转码后发现,innosetup生成的sql文件,如果是用SaveStringToFile生成的文件,执行的时候中文是乱码,如果用SaveStringToUTF8File,执行的时候报文件头部有非法字符,至此判断,应该是生成的是带BOM的UTF8文件。
查了下,大部分的思路都是写一些转换函数,有点麻烦。
理理思路,能不能从h2的角度去解决呢?
先看看h2的RunScript能不能指定文件编码呢,扒了源码,底层实现的方法上倒是有这个参数,但是从命令行进去的就没传这个值了。再找找,看有没有通过命令行运行单条sql的?发现同级有个Shell类,这个可以运行单条sql,这样就可以在安装过程中直接执行sql语句,就不用再执行sql文件了。
好了,这个问题就这么愉快的解决了。
条条大路通罗马,简单才是王道。