Скорее всего, вам нужно добавить charset='utf8'
к вашему вызову MySQLdb.connect()
.
Для самого MySQL наборы символов задаются раздельно во многих различных контекстах, в частности, для хранения обеих таблиц.и для соединений (и, к сожалению, во многих случаях MySQL, по-прежнему, по умолчанию использует latin-1).Итак, вы можете, например, перейти к задаче настройки всей базы данных для использования UTF-8:
CREATE DATABASE somedatabase DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
И все же, когда вы подключаете клиента, MySQL может все еще думать, что вы общаетесь сэто в какой-то другой кодировке:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Основным решением для этого является выполнение SET NAMES UTF8
сразу после подключения, прежде чем делать что-либо еще:
mysql> SET NAMES UTF8;
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Однако в вашем случаеэтого по-прежнему недостаточно, потому что сам модуль MySQLdb python также хочет быть полезным и автоматически кодировать / декодировать нативные строки Python для вас.Итак, вы должны установить набор символов в MySQLdb.Это лучше всего сделать, как упоминалось ранее, передавая charset='utf8'
при создании соединения MySQLdb.(Это также приведет к тому, что MySQLdb сообщит серверу mysql, что ваше соединение использует UTF8, поэтому вам не нужно запускать SET NAMES UTF8
напрямую)