0

所以在 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-8gradle.properties没有改变任何东西。

4

1 回答 1

1

在 groovy sql 中使用时.toString(),在 GStrings ( ) 的末尾添加。"${..}:${..}".toString()

于 2013-08-09T06:55:05.697 回答