Python - MySQL не вставляет Unicode - PullRequest
1 голос
/ 19 ноября 2010

Python 2.6.1, mysql 5.1 на ОСx Snow Leopard.

В моем коде Python для подключения я делаю; use_unicode = True, charset = "utf8"

MySQL говорит мне

mysql> SHOW VARIABLES LIKE "character_set%";
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | latin1                                                 |
| character_set_connection | latin1                                                 |
| character_set_database   | latin1                                                 |
| character_set_filesystem | binary                                                 |
| character_set_results    | latin1                                                 |
| character_set_server     | latin1                                                 |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.52-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)

Так что у нас все хорошо. Моя структура таблицы определяется как utf8

CREATE TABLE `urls` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url_idx` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Мое утверждение похоже на

insert("INSERT INTO urls (url) VALUES (%s)", (url, ))

но со строкой Юникода я получаю ошибку

UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 7: ordinal not in range(128)

Я понятия не имею ....

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Проблема не в вашей базе данных. Это даже не заходит так далеко. Вы полагаетесь на строковые манипуляции Python здесь:

insert("INSERT INTO urls (url) VALUES (%s)" % (url, ))

Никогда не делайте этого. Это плохо, потому что вы не только пытаетесь вставить Unicode-строку в ASCII, вы также оставляете себя открытым для атак SQL-инъекций. Вместо этого сделайте это (при условии, что ваша insert функция соответствует некоторому вызову в MySQLdb):

insert("INSERT INTO urls (url) VALUES (%s)", (url, ))

Разница в том, что теперь вы получаете MySQLdb для вставки значений, таким образом гарантируя, что они будут закодированы и правильно указаны в кавычках.

0 голосов
/ 29 мая 2012

Для меня я бы изменил настройку по умолчанию для mysql. Как? Откройте my.cnf и добавьте две строки в сеанс [mysqld] следующим образом:

[mysqld]
32 #
33 # * Basic Settings
34 #
35 user            = mysql
36 pid-file        = /var/run/mysqld/mysqld.pid
37 socket          = /var/run/mysqld/mysqld.sock
38 character-set-server = utf8
39 collation-server = utf8_unicode_ci

последние две строки (строки 38 и 39) - это то, что я добавляю. А затем перезапустите сервер MySQL и не забудьте восстановить базу данных и таблицы. После этого, я думаю, это должно работать. Я попробовал, и это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...