Проблемы с кодировкой MySQL / python - PullRequest
0 голосов
/ 31 марта 2020

Я использую py mysql (0.9.3) для объединения и очистки MySQL серверных (8.0.19) таблиц через python и записи таблицы в базу данных с использованием sqlalchemy. Но продолжайте выдавать неправильное строковое значение ошибки.

InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xC5\\x81asis...' for column 'client_last_name' at row 726")

Я пытался использовать наборы символов latin1, utf8 и utf8mb4 в своем подключении к базе данных и создателе движка, но ошибка та же.

db = pymysql.connect(host='', 
                          user='', 
                          password='', 
                          db='',
                          charset="utf8mb4")

engine = create_engine('mysql+pymysql://user:pass@port/schema'+'?charset=utf8mb4')

con = engine.connect()

Это строка кода, генерирующая ошибку: full_email_stats.to_sql("email_stats", con, if_exists="replace")

Трассировка:


  File "<ipython-input-33-8abe82be8923>", line 128, in <module>
    full_email_stats.to_sql("email_stats", con, if_exists="replace")

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 2663, in to_sql
    method=method,

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 521, in to_sql
    method=method,

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 1317, in to_sql
    table.insert(chunksize, method=method)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 755, in insert
    exec_insert(conn, keys, chunk_iter)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pandas/io/sql.py", line 669, in _execute_insert
    conn.execute(self.table.insert(), data)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 982, in execute
    return meth(self, multiparams, params)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 293, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1101, in _execute_clauseelement
    distilled_params,

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1250, in _execute_context
    e, statement, parameters, cursor, context

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1476, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
    raise value.with_traceback(tb)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1226, in _execute_context
    cursor, statement, parameters, context

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.py", line 148, in do_executemany
    rowcount = cursor.executemany(statement, parameters)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/cursors.py", line 197, in executemany
    self._get_db().encoding)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/cursors.py", line 229, in _do_execute_many
    rows += self.execute(sql + postfix)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/connections.py", line 732, in _read_query_result
    result.read()

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)

  File "/Users/AdrianAlvarez/opt/anaconda3/lib/python3.7/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)

InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xC5\\x81asis...' for column 'client_last_name' at row 726")

Кадры данных имели другую кодировку в MySQL. Кто-нибудь получил представление о том, как справиться с этим?

Это может быть растяжка, но я проделал ту же процедуру в r и у меня не было проблем с кодировками. Кто-нибудь знает почему?

...