2014-01-28 5 views
0

ВСЕ,Набор UTF8 на MySql

Я пытаюсь реализующий связь MySql из сценария Python. Вот что у меня есть:

try: 
    if append: 
     self.conn = MySQLdb.connect(.....) 
     self.cur = self.conn.cursor() 
    else: 
     self.conn = MySQLdb.connect(.....) 
     self.cur = self.conn.cursor() 
    self.conn.set_character_set('utf8;') 
    self.cur.execute('SET NAMES utf8;') 
    self.cur.execute('SET character_set_connection=utf8;') 
    self.cur.execute('SET GLOBAL innodb_large_prefix=ON') 
    self.cur.execute('SET GLOBAL innodb_file_format=barracuda') 
    self.cur.execute('SET GLOBAL innodb_file_per_table=ON') 
# Database and table creation 

Теперь мой вопрос: я должен запустить этот utf8 и «SET ..» запросы для каждого соединения или только при создании базы данных?

спасибо.

+0

Я не думаю, что есть набор символов с именем '' utf8; ''. – abarnert

+0

@abarnert, Ну, это сработало, поэтому я не смотрел на синтаксис. Но я беру на себя вопрос, что я должен выполнить эти строки, создаю ли я или добавляю. Я прав? – Igor

ответ

2

Эти разные команды выполняют разные вещи. И вы даже не делаете все правильные.

Во-первых, если вы используете либо pyMySQL или более поздней версии MySQLdb, пройти charset='utf8' (обратите внимание, что это 'utf8' без запятой прилагается!) В качестве аргумента команды connect. Это означает, что ваше соединение по умолчанию соответствует UTF-8, а также включен режим use_unicode, и вам не нужно set_character_set. Это лучшее решение. Вам, очевидно, нужно будет передавать это каждый раз, когда вы открываете соединение, поскольку это аргумент для подключения.

Если ваша библиотека не принимает аргумент charset, вам нужно будет использовать set_character_set, и вы должны сделать это сразу же после connect при каждом подключении. Но опять же, не включайте в себя этот трейлинг ;.

Во-вторых, если это Python 2.x, как только вы включите use_unicode, все строки SQL и все строковые параметры SQL должны быть unicode объекты, а не str объекты. Вы часто избегаете делать это неправильно (в основном, если они чисты ASCII), но вы не должны зависеть от этого. Это справедливо даже для глобальных, прагма и т. Д. При запуске: используйте u'…' Юникод-литералы для них тоже.

Между тем, те, первые два SET должны быть частью того, что ваша база данных библиотеки делает, когда вы передать его charset аргумент в connect или вызвать set_character_set. Вот почему более старая документация иногда говорит, чтобы пройти init_command='SET NAMES utf8', если вы не можете пройти charset='utf8'. Поэтому вам никогда не придется их делать.

Другие три вопроса SET, конечно, не имеют ничего общего с Unicode в первую очередь. Все они являются командами, которые влияют только на создание новых таблиц, но я понятия не имею, создаете ли вы когда-либо и каковы таблицы в последующих подключениях или только когда база данных изначально создана.

+0

Благодарим вас за разъяснение. Пара последующих действий: 1. Как узнать версию MySQLDB? 2. Какая минимальная версия должна использоваться с вашим первым предложением? 3. Может быть, ради совместимости всегда используйте «set_character_set»? 4. Последние 3 запроса - они будут выполняться, даже если новые таблицы не будут созданы, не так ли? – Igor

+0

Еще одна вещь, если вы знаете: что такое кодировка по умолчанию для подключения mySQL в Windows (как локальная, так и локальная - версия для разработки)? – Igor

+0

И еще один - где я должен включить «use_unicode»? Я использую Windows XP прямо сейчас для разработки. И, надеюсь, последний - первые 2 команды SET являются дополнительными, потому что они будут делать то, что сделает set_character_set, и поэтому они не нужны, правильно? – Igor

Смежные вопросы