Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2008 11:38:46

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

Использую алхимию 0.4. Там стоит все по дефолту. И ни как не могу заставить выбирать данные на русском через LIKE без учета регистра букв. Пробовал ставить в базе разные кодировки полей в таблице, но не помогает. Подскажите как совладать с этим…



Офлайн

#2 Май 12, 2008 12:50:41

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

а просто юникод пробовал ставить?
нативно sqlite - чисто юникодная



Офлайн

#3 Май 12, 2008 13:04:08

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

shiza
а просто юникод пробовал ставить?
нативно sqlite - чисто юникодная
Просто юникод я не знаю как поставить. Использую mysql и работаю с ней через программу SQLyong. Там нет возможность поставить кодировку юникод. Я так полагаю проблема вся в том, что mysql не понимает кодировку.



Офлайн

#4 Май 12, 2008 13:57:11

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

sql like по русски

shiza
а просто юникод пробовал ставить?
нативно sqlite - чисто юникодная
Вот как раз LIKE без учета регистра в sqlite c unicode не сделать :(
потому как lower и upper в ней с unicode не работают



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Май 12, 2008 15:25:00

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

Теперь я боле-мение понял. Модель у меня описана юникодом и хранит он в базе юникод… Значит надо, что бы mysql работал с юникодом или алхимия сохраняла все в утф. Думаю второй вариант предпочтительней. А то неохото лишние байты гонять :) Кто подскажет как это сделать?)



Офлайн

#6 Май 12, 2008 16:05:23

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

пишу так:
sqlalchemy.default.echo = true
sqlalchemy.default.convert_unicode = False
sqlalchemy.default.encoding='utf-8'
толку нуль, все равно в юникод херачит…



Офлайн

#7 Май 13, 2008 13:42:49

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

сори. я думал ты опечатлся и хотел написать sqlite (а это совсем не mysql), поэтому все что ниже моего первого ответа - не верно.

На самом деле - вопрос больше к MYSQL чем к питону.
Все дело в Collation.
Делаешь кодировку базы UTF8, charset поля utf8, Collation поля - utf8_unicode_ci.
Должно работать.



Отредактировано (Май 13, 2008 13:54:31)

Офлайн

#8 Май 13, 2008 19:45:39

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

кодировку базы обязательно? остальное все делал. Щас поставлю пятерку, посмотрю что будет.



Офлайн

#9 Май 13, 2008 20:48:20

Naota
От:
Зарегистрирован: 2007-06-04
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

Поставил пятый мускул. База в юникоде.
Таблица:

CREATE TABLE `test` (                                                                                         
`id` int(11) NOT NULL auto_increment,
`name` text collate utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
Модель:
test_table = Table('test', metadata,
    Column('id', types.Integer, primary_key=True, autoincrement=True),
    Column('name', types.Unicode)
)
Запрос:
# -*- coding: utf-8 -*-
    def test(self):
        from video.model import Session, test_table
        from sqlalchemy.sql import select
        q = test_table.insert(values={'name':u'пуля'})
        Session.execute(q)
        q = test_table.insert(values={'name':u'Пуля'})
        Session.execute(q)
        q = test_table.insert(values={'name':u'ПуЛя'})
        Session.execute(q)
        Session.commit()
        t = test_table.alias('t')
        q = select([t.c.name], t.c.name.like(u'Пуля'))
        s = []
        for n in Session.execute(q):
            s.append(n.name)
        return ', '.join(s)
Результат одно слово “Пуля” :(



Офлайн

#10 Май 13, 2008 21:10:08

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

sql like по русски

а если попробовать выполнить в SQLyong:

select * from test where name LIKE 'пуля'
Правильно выборку делает?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version