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

MySQLdb._exceptions.OperationalError: 1366 ao rodar prepara_banco.py

Olá,

Quando rodo o arquivo prepara_banco.py acontece o seguinte problema: MySQLdb._exceptions.OperationalError: (1366, "Incorrect string value: '\xE7\xE3o' for column 'categoria' at row 1")

O problema só acontece quando tento inserir algum nome com acento em alguma das tabela Usuario ou Jogo. Ex: ele não permite inserir ('God of War 4', 'Ação', 'PS4'), pois a palavra Ação tem esses caractéres acentuados.

Vi que o código de criação das tabelas também já está setado com utf8:

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

Mesmo assim ainda tenho esse erro.

3 respostas
solução!

Oi Graciliano, tudo bem?

O instrutor deste curso, o Luan, respondeu uma dúvida parecida neste link e a sugestão dele é para que mude de utf8 para latin1, que provavelmente é a configuração padrão do seu ambiente para se conectar com o MySQLdb:

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

Tente esta solução. E se o erro persistir me avise que buscamos algum outro caminho.

Espero ter ajudado. Abraços e bons estudos!

Uhuul! Funcionou!

Muito obrigado.

Uma outra dúvida, isso vem como default do MySQL conforme a configuração do PC? Por que minha máquina é toda configurada em Francês ( o OS também).

Att.

Graciliano, quando declaramos o SET NAME, ele irá se comportar de acordo com a configuração do cliente, que no caso é o seu computador. Como ele está em francês, então a codificação do MySQL também fica em Francês. No geral, o programa vai identificar a configuração de idioma do computador para tentar utilizar um locale ideal, por isso que tivemos o erro.

Espero ter ajudado. Abraços e bons estudos!