UncategorizedSQLException Неправильная ошибка значения строки при сохранении текста непосредственно из текстового файла в базу данных? - PullRequest
0 голосов
/ 13 января 2019

Я импортирую файл и читаю его содержимое. Затем я сохраняю контент прямо в базу данных. Пример кода выглядит следующим образом.

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

UPDATE:

Вот фактический код

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 голосов
/ 13 января 2019

ключ

java.sql.SQLException: Incorrect string value: '\xEF\xBB\xBFNan'

\xEF\xBB\xBF или EFBBBF является меткой порядка байтов (BOM) для кодировки UTF-8

и, похоже, ваша база данных препятствует неправильному преобразованию кодировки из потока в строку

фактически первые 2-5 байтов в текстовом файле могут отображать кодировку Unicode, которая использовалась для сохранения файла (UTF-8, UTF-16, UTF-32, ...).

если вам нужно прочитать текстовый файл с разными кодировками, я предлагаю вам использовать BOMInputStream из общих apache io

вот так:

import org.apache.commons.io.input.BOMInputStream
...

BOMInputStream bis = new BOMInputStream(file.getInputStream())
//get charset from stream or default if not defined
String charset =  bis.getBOM()?.getCharsetName() ?: "UTF-8" 
String content = bis.getText(charset)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...