На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > python MySQLdb + кириллица
      Имеется база данных MySQL в KOI8-R. Имеется скрипток на python с использованием MySQLdb, который выбирает из БД данные. Вначале у меня вся кириллица была вопросиками. Как ни прыгал внутри скрипта - не помогало. Нашел рекомендацию подправить в настройках самого мускула кодировку клиента на KOI8-R. Поменял. Помогло. Но ведь это не выход. А как быть в общем случае? (тот же php и perl нормально работали без изменения настроек мускула)
      Еще обнаружилась вторая проблема - при попытке сделать INSERT в БД кириллицей на том же KOI8-R скрипт вылетает с жуткой ошибкой где-то среди модулей со строкой encoding. Как быть? Может кто что подскажет?
        Подсказать без самого скрипта... Короче юзай правильно кодировки! ;)
          ExpandedWrap disabled
            #!/usr/local/bin/python
            # -*- coding: koi8-r -*-
             
            import MySQLdb
             
            # Настройки базы данных
            dbname="dbname"
            host="localhost"
            dblogin="login"
            dbpass="pass"
             
            # Соединение и запрос к БД
            db = MySQLdb.connect(db='%s' % (dbname), host='%s' % (host), user='%s' % (dblogin), passwd='%s' % (dbpass))
            c = db.cursor()
            c.execute("SELECT Username,Customers.CustomerID,Balance,Overdraft,ifnumber,PackageGroupID,old_in,old_out,Accounts.AccountID FROM Accounts INNER JOIN dec_is_wan ON Accounts.AccountID=dec_is_wan.AccountID INNER JOIN Customers ON Accounts.CustomerID=Customers.CustomerID")
             
            # Тут куча кода не по теме
            ..................
             
            for cur_cl in c.fetchall():
               # Данные о текущем клиенте
               username = cur_cl[0]
               cus_id = cur_cl[1]
               balance = cur_cl[2]
               overdraft = cur_cl[3]
               ifnumber = cur_cl[4]
               package_group_id = cur_cl[5]
               old_in = cur_cl[6]
               old_out = cur_cl[7]
               acc_id = cur_cl[8]
             
             
               # Тут тож арифметика всякая
            ..............
             
               # Раньше тут бралось из БД описание в кириллице. но до правки конфига самой mysql на тему кодироовки клиента КОИ8 были одни вопросики
            #   cc = db.cursor()
            #   cc.execute("SELECT Description FROM PackageGroup WHERE PackageGroupID=%d" % (package_group_id))
            #   res_cur = cc.fetchone()
            #   descr = res_cur[0]
            #   print descr
            #   cc.close()
               # Начал задавать статик описание латиницей - если задать кириллицей - нижзе будет "борода"
               descr = "Traffic mode (LU: %s) day/night" % (update_time)
            ..............................
            ..............................
                  # Вот тут идет вставка дескрипшина в кириллице (только временно в латинице)
                  # Когда из БД он выбирался (см. выше) вопросиками - он тут нормально вставлялся
                  # Когда в конфиг самого мускула вписал, что клиент в кодировке КОИ8 - из БД выбираться дескрипшн стал нормально
                  # А вот при вставке кириллицы - тут вылетает еррор - смотри после кода
                  # Если задать descr = "Киррилица" - тот же эффект
                  cc.execute("INSERT INTO Invoices (CustomerID,Description,DateBilled,Amount) values (%d,\"%s\",\"%s\",%f)" % (cus_id,descr,curdate,amount))
            ..................................
            ..................................
             
            c.close()
             
            db.close()


          Вот пример для ошибки для запроса апдейт с переменной descr содержащей кириллицу
          # ./Acct_WAN.py
          Traceback (most recent call last):
          File "./Acct_WAN.py", line 195, in ?
          cc.execute("UPDATE Invoices SET Amount=%f,Description=\"%s\" WHERE InvoiceID=%d" % (amount,descr,inv_id))
          File "/usr/local/lib/python2.4/site-packages/MySQLdb/cursors.py", line 146, in execute
          query = query.encode(charset)
          UnicodeDecodeError: 'ascii' codec can't decode byte 0xd9 in position 62: ordinal not in range(128)
            На вид вроде все верно!
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0670 ]   [ 15 queries used ]   [ Generated: 26.04.24, 01:35 GMT ]