那么在 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
的值(以及 project.scenarioFilename
和 classifier
),从而产生一些像\xAC 这样的转义字符是 Not Acceptable 。
但有趣的是,如果我这样做
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')}"
却不是?
顺便说一句,在 gradle.properties
中设置 systemProp.file.encoding=utf-8
不会改变任何内容。
最佳答案
使用时在 GString 末尾添加 .toString()
("${..}:${..}".toString()
)常规 SQL。
关于mysql - gradle中字符串的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18139370/