所以在 gradle 构建中,为什么 Java 字符串会
"foo"
可以被具有 UTF-8 编码的 mySQL 数据库接受,但 GString
"${someValue}"
不会?
发生的事情是这样的:
sql.withTransaction {
def batchResult = sql.withBatch(
20,
'insert into table(job_id, log_name, scenario_name, classification, value) values (?,?,?,?,?)'){ stmt ->
rows.each { r ->
def jobId = "${System.getenv('JOB_NAME')}:${System.getenv('BUILD_NUMBER')}"
def classifier = "{'observer_id':${r['observer_id']}, 'sensor_name':${r['sensor_name']}}"
stmt.addBatch(
jobId,
"foo",
project.scenarioFilename,
classifier,
r['count(1)'])
}
}
这会失败,因为 UTF-8 编码的数据库拒绝jobId
(and project.scenarioFilename
, and classifier
) 的值,将一些转义字符(如 \xAC)视为不可接受的。
但有趣的是,如果我这样做
stmt.addBatch(
new String(jobIdStr.getBytes("UTF-16"),"UTF-8"),
"foo",
new String(project.scenarioFilename.getBytes("UTF-16"),"UTF-8"),
new String(classifier.getBytes("UTF-16"),"UTF-8"),
r['count(1)']
)
有用。
那么为什么被"foo"
视为 UTF-8 而"${System.getenv('JOB_NAME')}"
不是呢?
顺便说一句,设置systemProp.file.encoding=utf-8
并gradle.properties
没有改变任何东西。