Недопустимая последовательность байтов, хотя строка является допустимым UTF8 - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь написать текстовый файл для Postgres оптового импортера. Код в настоящее время падает, поскольку строка, которая должна быть вставлена ​​в postgres, не является допустимой UTF8: pq: invalid byte sequence for encoding UTF8: 0x00

В моем коде я проверяю, являются ли строки допустимым UTF8 или нет.

Чего мне не хватает?

Код:

for {
        line, more := <-lineChannel

        splitLine := strings.SplitN(line, ":", 2)

        if len(splitLine) == 2 {
            if utf8.Valid([]byte(splitLine[0])) && utf8.Valid([]byte(splitLine[1])) {
                lineCount++
                _, err = stmt.Exec(splitLine[0], splitLine[1])

                if lineCount%int64(copySize) == 0 {

                    _, err = stmt.Exec()
                    if err != nil {
                        log.Fatal("Failed at stmt.Exec", err)
                    }

                    err = stmt.Close()
                    if err != nil {
                        log.Fatal("Failed at stmt.Close", err)
                    }

                    err = txn.Commit()
                    if err != nil {
                        log.Fatal("failed at txn.Commit", err)
                    }

                    txn, err = db.Begin()
                    if err != nil {
                        log.Fatal("failed at db.Begin", err)
                    }

                    stmt, err = txn.Prepare(pq.CopyIn("pwned", "username", "password"))
                    if err != nil {
                        log.Fatal("failed at txn.Prepare", err)
                    }

                    if lineCount%(int64(copySize)*10) == 0 {
                        log.Printf("Inserted %v lines", lineCount)
                    }
                }

                if err != nil {
                    log.Println("error:", splitLine[0], splitLine[1])
                    log.Fatal(err)
                }
            }

EDIT: Строка с ошибкой:

Байт []: [116 109 97 105 108 46 99 111 109 58 104 117 115 104 112 117 112 112 105 101 115 108 111 118 101]

строка: username@hotmail.whatever:hushpuppieslove

splitLine [0] + splitLine [1]: username@hotmail.whatever hushpuppieslove

1 Ответ

2 голосов
/ 30 мая 2019

0x00 является нулевым символом, и postgres не допускает этого в строках.Начиная с документа :

Символ NULL (0) недопустим, так как типы текстовых данных не могут хранить такие байты.

Вам понадобитсявычеркнуть нулевые символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...