H
H
HexUserHex2021-10-27 22:25:31
Python
HexUserHex, 2021-10-27 22:25:31

Problems with encoding when working with PostgreSQL DBMS and python pickle module?

In my script I use the pickle module

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


To save the vectors obtained earlier in binary form in the database, everything works BUT
when trying to save the character '' (so far it only causes problems, I don't know about others ..) which is printable, since the ''.isprintable() function returns true.

I am getting an error:
mysql.connector.errors.DataError: 1366 (22007): Incorrect string value: '\xF0\x9D\x95\xB2' for column `test`.`test`.`a` at row 1


If I include encoding in base UTF8 encoding:
cur.execute("SET NAMES 'utf8';")
cur.execute("SET CHARACTER SET utf8;")


then this symbol is SAVE to the database successfully!
But only the beginning is saved from my vector (using: pickle.dumps()), here is this piece:
b'?\x04]?.'

Instead of for example:
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\[email protected]\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\[email protected]\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\[email protected]\xcc+\xb8?\x00\x00\x00\xa0\x1av\xad?\x00\x00\[email protected]\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\[email protected]\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\[email protected]\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\[email protected]=\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\[email protected]\xd2^\xb0\xbf\x00\x00\[email protected]\\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\[email protected]\xe4\xc4\x9d\xbf\x00\x00\[email protected]_\x9a?\x00\x00\x00\x00>\xc7\xcd?\x00\x00\[email protected]\x82B\xa9\xbf\x00\x00\x00\xa0\x0f\xce\xa8\xbf\x00\x00\x00\xc0\x86\xc1\xd3?\x00\x00\[email protected](,\xa8?\x00\x00\[email protected]\x9d\x1d\x9c\xbf\x00\x00\[email protected]\xfa3\x99\xbf\x00\x00\x00 \xce\xb0\xb9?\x00\x00\x00 \x12\xb5\xb3\xbf\x00\x00\x00\xc0G\xee\xb0?\x00\x00\[email protected]\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\[email protected]\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\[email protected]\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.'


Simplified example of a piece of code:

# 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)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vindicar, 2021-10-27
@Vindicar

From the pickle module documentation:
> The pickle module implements binary protocols for serializing and de-serializing a Python object structure.
This is binary data, not text in any encoding.
Either use a BLOB column type or equivalent, or do base64 encoding first, but that's even harder.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question