@HexUserHex

Проблемы с кодировкой при работе с СУБД PostgreSQL и python модулем pickle?

В своем скрипте я использую модуль pickle

pickle.loads(data_from_db) и pickle.dumps(data_to_save)


Для сохранения полученных ранее векторов в бинарном виде в БД, все работает НО
при попытке сохранить в базу символ ''(пока только он вызывает проблемы, насчет других я не знаю..) который является печатаемым так как функция ''.isprintable() возвращает True.

Получаю ошибку:
mysql.connector.errors.DataError: 1366 (22007): Incorrect string value: '\xF0\x9D\x95\xB2' for column `test`.`test`.`a` at row 1


Если я включаю кодировку в базе кодировку UTF8:
cur.execute("SET NAMES 'utf8';")
cur.execute("SET CHARACTER SET utf8;")


то данный символ СОХРАНЯЕТСЯ в базу успешно!
Но от моего вектора сохраняется(c помощью: pickle.dumps()) только начало, вот этот кусок:
b'?\x04]?.'

Вместо например:
b'\x80\x04\x95\x8e\x04\x00\x00\x00\x00\x00\x00]\x94\x8c\x15numpy.core.multiarray\x94\x8c\x0c_reconstruct\x94\x93\x94\x8c\x05numpy\x94\x8c\x07ndarray\x94\x93\x94K\x00\x85\x94C\x01b\x94\x87\x94R\x94(K\x01K\x80\x85\x94h\x04\x8c\x05dtype\x94\x93\x94\x8c\x02f8\x94\x89\x88\x87\x94R\x94(K\x03\x8c\x01<\x94NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00t\x94b\x89B\x00\x04\x00\x00\x00\x00\x00\xc0\x1d\xfe\x90\xbf\x00\x00\x00@\xef\x07\xa3?\x00\x00\x00\xc0+-\xa1?\x00\x00\x00\xa0\xd1\x96\xb3\xbf\x00\x00\x00\x80.\x19\xbd\xbf\x00\x00\x00 \xb6\\\xa5\xbf\x00\x00\x00\x80\x8f\xb8\x8c\xbf\x00\x00\x00\xc0\xea\xbd\xb3\xbf\x00\x00\x00\xa0\xbe_\xc9?\x00\x00\x00\xe0R\xcc\xb4\xbf\x00\x00\x00\x00X\xb1\xbd?\x00\x00\x00\x80\x9d\xfem\xbf\x00\x00\x00`\x0b\xf1\xc8\xbf\x00\x00\x00\xa0g\x88\xa7?\x00\x00\x00\x80u\x17\x98\xbf\x00\x00\x00\xe0\x16\x1a\xc7?\x00\x00\x00`X\x95\xc1\xbf\x00\x00\x00\xc0\x8c*\xc0\xbf\x00\x00\x00 \xd5\r\xb8\xbf\x00\x00\x00 h\xc9\xaa\xbf\x00\x00\x00\xc01\xafu\xbf\x00\x00\x00\x004\x93\xb1?\x00\x00\x00\x80\xb2\xab\xb4?\x00\x00\x00 \xf7\xd6\xc1?\x00\x00\x00\xc0O\xda\xb3\xbf\x00\x00\x00\xe0\xd1\x17\xd3\xbf\x00\x00\x00\x80\xa5\xba\xb7\xbf\x00\x00\x00\x80!\xad\xc1\xbf\x00\x00\x00\x80\xd6(\x97\xbf\x00\x00\x00\x00\xdd\xce\xc2\xbf\x00\x00\x00`)\x80\xb1?\x00\x00\x00@\x08\x15\xb5?\x00\x00\x00\x00\xfa\xf6\xbd\xbf\x00\x00\x00\x80\xde\xf2\x88\xbf\x00\x00\x00\xc0\x9f\xcd\x91?\x00\x00\x00\xc0S\xb8\x8e?\x00\x00\x00\xe0\x19\x92\xb5\xbf\x00\x00\x00\xe0?\x96\xc2\xbf\x00\x00\x00\xc0SA\xd0?\x00\x00\x00\xc0|\xff\xaf?\x00\x00\x00 \x1f\xcc\xd1\xbf\x00\x00\x00\x80\xad\x7f\x8e?\x00\x00\x00\xe0\xa5\x92\xae?\x00\x00\x00\xa0G\xa8\xd0?\x00\x00\x00\x00\xe1\x97\xd0?\x00\x00\x00\xe0\x16U}?\x00\x00\x00\xa0\xdap\xba?\x00\x00\x00\x00\x18\xea\xb6\xbf\x00\x00\x00`\\\x00\xc3?\x00\x00\x00 \xd7w\xd4\xbf\x00\x00\x00@\xcc+\xb8?\x00\x00\x00\xa0\x1av\xad?\x00\x00\x00@\x81\x85\xa9?\x00\x00\x00\x80\xc3\xf6\xb5?\x00\x00\x00`B\xec\xa9?\x00\x00\x00\xc0\x1d_\xca\xbf\x00\x00\x00\xc0&\xcc\x81?\x00\x00\x00@\x1b\x83\xb4?\x00\x00\x00\x80C^\xcd\xbf\x00\x00\x00\x00\x88t\xb1?\x00\x00\x00\xe0\xcc}\xb6?\x00\x00\x00\x80\x8cQ\xa7\xbf\x00\x00\x00\xe0\xa6\xbf\x98?\x00\x00\x00 ?\x95\x88\xbf\x00\x00\x00@0\xf3\xca?\x00\x00\x00\xa0\x1f\xd7\xbe?\x00\x00\x00\x80\x1d\xc3\xbc\xbf\x00\x00\x00\x00\x1e\xa8\xc6\xbf\x00\x00\x00`\x85\x8a\xc7?\x00\x00\x00`\x05Y\xd1\xbf\x00\x00\x00\x80\x94!\xa6\xbf\x00\x00\x00 i\x92\xc8?\x00\x00\x00 \xed\x96\xbb\xbf\x00\x00\x00`I^\xcc\xbf\x00\x00\x00@=\xec\xca\xbf\x00\x00\x00\xc0\xe2\xf6\x99?\x00\x00\x00\xe0\xf5j\xd6?\x00\x00\x00 \xd0g\xc5?\x00\x00\x00\xe0\x99\x8c\xb0\xbf\x00\x00\x00\x80\xd9\xcde?\x00\x00\x00@\xd2^\xb0\xbf\x00\x00\x00@\\7\xa0\xbf\x00\x00\x00`\xff%\xa6\xbf\x00\x00\x00\x00\xe7(\xc8?\x00\x00\x00\xc0Q\x9d\xa5?\x00\x00\x00\x80*\x08\x92\xbf\x00\x00\x00@\xe4\xc4\x9d\xbf\x00\x00\x00@l_\x9a?\x00\x00\x00\x00>\xc7\xcd?\x00\x00\x00@\x82B\xa9\xbf\x00\x00\x00\xa0\x0f\xce\xa8\xbf\x00\x00\x00\xc0\x86\xc1\xd3?\x00\x00\x00@(,\xa8?\x00\x00\x00@\x9d\x1d\x9c\xbf\x00\x00\x00@\xfa3\x99\xbf\x00\x00\x00 \xce\xb0\xb9?\x00\x00\x00 \x12\xb5\xb3\xbf\x00\x00\x00\xc0G\xee\xb0?\x00\x00\x00@\x99\x14\xb9\xbf\x00\x00\x00\x80\xf6\xd9\xa0?\x00\x00\x00\xa0^\xdb\xaa\xbf\x00\x00\x00\x80\xe0\xc5\xa8?\x00\x00\x00\x80\x03\xc5\x96?\x00\x00\x00 ;W\xb1?\x00\x00\x00\x00\x17\xda\xc6\xbf\x00\x00\x00\xc0\xae\x1c\xd0?\x00\x00\x00\xa0\x14Z\xbb\xbf\x00\x00\x00\x00\x94\r\xaa\xbf\x00\x00\x00\xa0\x97\x8c\xb7\xbf\x00\x00\x00\x00\x04\xb3\xa4\xbf\x00\x00\x00@\x88\xad\xa7\xbf\x00\x00\x00\x00\xa2\xb9m?\x00\x00\x00\xc0y+\xc7?\x00\x00\x00\x80\xa3\xaa\xd0\xbf\x00\x00\x00\xa0\x19\x81\xc1?\x00\x00\x00\xc0\x1bP\xc5?\x00\x00\x00\x80\xfe\xa4\xb5?\x00\x00\x00\xc0\xad9\xc1?\x00\x00\x00`\x87e\xa6\xbf\x00\x00\x00\x80\x1fx\xb3?\x00\x00\x00\xe0\rO\xb1?\x00\x00\x00@\xa4\x9a\xb7\xbf\x00\x00\x00\xa0\x98\xa4\xcb\xbf\x00\x00\x00\xc0vLe?\x00\x00\x00\xc0\xe5\x8a\xa9?\x00\x00\x00 9[\xa6\xbf\x00\x00\x00 \x01\x84\x80\xbf\x00\x00\x00\xa0\xe7z\xb1?\x94t\x94ba.'


Упрощенный пример части кода:

# DB
conn = mysql.connect(
  host = 'localhost',
  user = 'root',
  passwd = 'password'
)

cur = conn.cursor(buffered=True)
cur.execute("CREATE DATABASE IF NOT EXISTS test;")

cur.execute("USE test;")

#cur.execute("SET NAMES 'utf8';")
#cur.execute("SET CHARACTER SET utf8;")

cur.execute("CREATE TABLE test(a VARCHAR(32))")

# BUG CHAR
data = ('',)

cur.execute('INSERT INTO test(a) VALUES(%s)', data)
  • Вопрос задан
  • 470 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Из документации модуля pickle:
> The pickle module implements binary protocols for serializing and de-serializing a Python object structure.
Это двоичные данные, а не текст в какой-бы то ни было кодировке.
Либо используй тип столбца BLOB или эквивалентный, либо предварительно делай base64-кодирование, но это ещё сложнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы