UncategorizedSQLException将文本直接从文本文件直接保存到数据库时,字符串值错误吗?

时间:2019-01-13 07:50:39

标签: mysql hibernate grails groovy

我导入文件并读取其内容。然后,我将内容直接保存到数据库。代码示例如下。

def file = request.getFile('file')
if (file.empty) {
    flash.message = "File cannot be empty"
    return
}
String content = new String(file.getBytes())
Product product = new Product()
product.description = content
product.save(flush:true, failOnError:true)

保存失败并引发以下错误。

org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not insert: [Product]; uncategorized SQLException for SQL [...]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xEF\xBB\xBFNan' for column 'product_description' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xEF\xBB\xBFNan' for column 'product_description' at row 1

我猜这个问题与编码有关。我想知道在将内容保存到数据库之前是否需要对从文件导入的内容执行某些操作。

感谢您的帮助。谢谢!

请在错误屏幕下方查看

enter image description here

更新:

这是实际的代码

def uploadRegistrations() {


    def file = request.getFile('file')

    if (file.empty) {
        flash.message = "File cannot be empty"
        return
    }

    String content = new String(file.getInputStream().getText('UTF-8'))

    def id = params['id']    

    def event = CompositeEvent.get(id.toLong())



    def reg = new RaceRegistration(race: event.races[0], compositeEvent: event, raceParticipant: new EmbeddedRaceParticipant(
            firstName: content.split(',')[0],
            lastName: "none",
            gender: Gender.MALE

    ),
            waiver: Waiver.getInstance(event),
            status: EntityStatus.ACTIVE

    )

    reg.save(flush: true, failOnError: true)

重要的部分是内容用于RaceRegistration域的名字。

1 个答案:

答案 0 :(得分:1)

输入

G[_]

java.sql.SQLException: Incorrect string value: '\xEF\xBB\xBFNan' \xEF\xBB\xBF是用于UTF-8编码的Byte order mark (BOM)

看来您的数据库阻止您执行从流到字符串的错误编码转换

实际上,文本文件中的前2-5个字节可以显示用于保存文件的unicode编码(UTF-8,UTF-16,UTF-32等)。

如果您需要读取具有不同编码的文本文件,我建议您使用BOMInputStream from apache commons io

像这样:

EFBBBF