Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Erro ao executar prepara_banco.py (Incorrect string value: '\\xE7\\xE3o' for column 'categoria')

Olá!

Ao preparar o banco de dados mySQL usando o script prepara_banco.py me deparei com uma mensagem de erro:

_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\xE7\xE3o' for column 'categoria' at row 1")

Parece que não estou conseguindo inserir string com caracteres acentuados nas tabelas. O script foi executado sem alterações.

Saída completa da execução do script e versão Python utilizada em PS.

TIA,

WB::

C:\Anaconda3\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2017.3.2\helpers\pydev\pydevconsole.py" 49357 49358

import sys; print('Python %s on %s' % (sys.version, sys.platform))
sys.path.extend(['C:\\Dev\\Alura\\Python3\\Flask1', 'C:/Dev/Alura/Python3/Flask1'])

Python 3.6.2 |Anaconda, Inc.| (default, Sep 20 2017, 13:35:58) [MSC v.1900 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
PyDev console: using IPython 6.1.0

Python 3.6.2 |Anaconda, Inc.| (default, Sep 20 2017, 13:35:58) [MSC v.1900 32 bit (Intel)] on win32
C:\Anaconda3\python.exe C:/Dev/Alura/Python3/Flask1/prepara_banco.py
Conectando...
 -------------  Usuários:  -------------
Danilo
Luan Marques
Nico
Traceback (most recent call last):
  File "C:/Dev/Alura/Python3/Flask1/prepara_banco.py", line 52, in <module>
    ('Fire Emblem Echoes', 'Estratégia', '3DS'),
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 281, in executemany
    self._get_db().encoding)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 318, in _do_execute_many
    rows += self.execute(sql + postfix)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 250, in execute
    self.errorhandler(self, exc, value)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 50, in defaulterrorhandler
    raise errorvalue
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 247, in execute
    res = self._query(query)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 411, in _query
    rowcount = self._do_query(q)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\cursors.py", line 374, in _do_query
    db.query(q)
  File "C:\Anaconda3\lib\site-packages\MySQLdb\connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.OperationalError: (1366, "Incorrect string value: '\\xE7\\xE3o' for column 'categoria' at row 1")

Process finished with exit code 1
6 respostas
solução!

Olá Wilson,

Isso acontece pois seu ambiente, provavelmente, está usando latin1 para se comunicar com o mysql por padrão. Consegui reproduzir o problema com a versão mais recente do MySQL (5.7.20). Para resolver a única mudança que fiz foi mudar a primeira linha do comando de criar a tabela de utf8 para latin1. Como abaixo.

criar_tabelas = '''SET NAMES latin1;
 # resto do código....

Já vou alterar o arquivo disponível no curso pra reduzir futuros problemas. E vou sinalizar a versão do MySQL usada pra facilitar também.

Espero que funcione aí pra você. Me avise se tiver mais problemas.

Oi Luan, Tive o mesmo problema o Wilson, mas consegui resolver com a sua dica. Obrigado!

Boa noite, Luan!

Funcionou com o ajuste aqui.

Apenas a título de curiosidade: O que eu precisaria mudar no mySQL para que o script funcione sem alterações?

A versão do mySQL aqui é 5.7.17

Atc,

WB::

Opa!

Na verdade o que fizemos já altera o banco. Esse set NAMES, faz 3 configurações no banco para que ele não tenha problemas com a acentuação que normalmente usamos.

O que deve ter acontecido é que o seu sistema interage com o banco de dados usando latin1, por padrão. Desta forma é necessário configurar o banco para que a leitura e escrita suporte esta codificação.

Que bom que era isso mesmo. Codificação não é sempre algo tranquilo de resolver! =]

Um abraço!

Luan

Pessoal, quem tiver problemas é só remover a acentuação dos inserts no cadastro dos jogos:

trocar Ação por Acao e Estratégia por Estrategia.

inserindo jogos

cursor.executemany( 'INSERT INTO jogoteca.jogo (nome, categoria, console) VALUES (%s, %s, %s)', [ ('God of War 4', 'Acao', 'PS4'), ('NBA 2k18', 'Esporte', 'Xbox One'), ('Rayman Legends', 'Indie', 'PS4'), ('Super Mario RPG', 'RPG', 'SNES'), ('Super Mario Kart', 'Corrida', 'SNES'), ('Fire Embem Echoes', 'Estrategia', '3DS ') ])

O script para rodar com a versão mais atual do MySQL criando as tabelas com utf8 em vez de latin 1 é simplesmente:

CREATE DATABASE `jogoteca` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    USE `jogoteca`;
    CREATE TABLE `jogo` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(50) NOT NULL,
      `categoria` varchar(40) NOT NULL,
      `console` varchar(20) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    CREATE TABLE `usuario` (
      `id` varchar(8) NOT NULL,
      `nome` varchar(20) NOT NULL,
      `senha` varchar(8) NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;'''