Имя: Пароль:
IT
Админ
Проблема отображения русских букв в базе данных Sqlite3 Python
0 sidalexsandr
 
07.07.09
12:25
Написал использовать кодировку utf-8

1) Скрипт создания базы данных в третьей колонке значение русскими буквами
# -*- coding: utf-8 -*-
import sqlite3

con = sqlite3.connect('books.db')  
cur = con.cursor()  
cur.execute('CREATE TABLE books (id INTEGER PRIMARY KEY, title VARCHAR(100), author VARCHAR(30))')  
cur.execute('INSERT INTO books (id, title, author) VALUES(1, "Mathematics", "Иванов")')
cur.execute('INSERT INTO books (id, title, author) VALUES(2, "lirika", "Петров")')
cur.execute('INSERT INTO books (id, title, author) VALUES(3, "Astronomija", "Сидоров")')
con.commit()
cur.close()

2) Скрипт добавления и просмотра:
# -*- coding: utf-8 -*-
import string,cgi,sqlite3
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

page0="""
<b>menu</b><rb>
<form action="" method="post" > <input type="submit" value="send post" > </form>
<form action="sql" method="get" > <input type="submit" value="books base" > </form>
"""

page_start="""
<b>books</b><br>
<table border=1 width=600>  <tr><td><b>id</b></td><td><b>title</b></td><td><b>author</b></td></tr>
"""

page_end="""
</table>
<form action="sql" method="get" > <input type="submit" value="show all" > </form>
<form action="send_select" method="get" > id: <input name="id" type=text size=3> <input type="submit" value="select" > </form>
<form action="send_delete" method="get" > id: <input name="id" type=text size=3> <input type="submit" value="delete" > </form>
<form action="send_put" method="get" > id: <input name="id" type=text> title: <input name="title" type=text> author: <input name="author" type=text> <input type="submit" value="put" > </form>
"""


def show_base(self):
page=page_start
con = sqlite3.connect('books.db')
cur = con.cursor()
cur.execute('SELECT * FROM books')  
for row in cur:  page+='<tr><td>'+str(row[0])+'</td><td>'+row[1]+'</td><td>'+row[2]+'</td><tr>'
page+=page_end
cur.close()
self.wfile.write(page)




class MyHandler(BaseHTTPRequestHandler):

   def do_GET(self):

       plist = self.path.split("?")
       self.send_response(200)
       self.send_header('Content-type',    'text/html')
       self.end_headers()
       
       if plist[0]=='/' : self.wfile.write(page0)
               
   if plist[0]=='/send_put' :
    pl=plist[1].split("&") #split values
    l1=pl[0].split('=') #get id value
    l2=pl[1].split('=') #get title value
    l3=pl[2].split('=') #get author value
    data=(l1[1],l2[1],l3[1])
    con = sqlite3.connect('books.db')
    cur = con.cursor()
    cur.execute('INSERT INTO books (id, title, author) VALUES(?, ?, ?)',data)  
        con.commit()
    cur.close()
    show_base(self)

   

   if plist[0]=='/sql' : show_base(self)
       
       
   
       
def main():
   server = HTTPServer(('', 80), MyHandler)
   print 'started httpserver...'
   server.serve_forever()
   

if __name__ == '__main__':
   main()



Вопрос: 1) Почему при запуске второго скрипта он ругается на кодировку русских букв и не показывает базу данных? (Если в третьей колонке ввести англискими буквами то все отображается).
2) Как сделать чтобы в базу данных можно было добавлять и читать из неё значения колонок занесенные русскими буквами?
1 sidalexsandr
 
07.07.09
12:27
Ещё интересует может кто знает живые форумы по Python, а то нашел только http://python.su/forum/index.php и он какой-то полумертвый.
2 smaharbA
 
07.07.09
12:29
а из под шела кажет ? (если просто запустить как скрипт)
3 smaharbA
 
07.07.09
12:31
это линукс ?
4 sidalexsandr
 
07.07.09
12:34
Написано в windows на python + sqlite3
5 sidalexsandr
 
07.07.09
12:34
Для запуска расширение .py
6 smaharbA
 
07.07.09
12:49
тогда не знаю
еслиб линукс, то

import os

os.environ["LANG"]="ru_RU.UTF-8"


да и пайтон слабо знаю, скулайт вообще не знаю :(
7 smaharbA
 
07.07.09
12:51
+(6) если под виндой, то скорее всего нужен какой то энкод/рекод в коде использовать
8 sidalexsandr
 
07.07.09
12:52
Сейчас попробую.
9 sidalexsandr
 
07.07.09
12:56
smaharbA к сожалению не работает.
10 Мяв-Мяв
 
07.07.09
12:56
# -*- coding: utf-8 -*- означает не "использовать кодировку utf-8", а "текст программы написан в кодировке utf-8"
в какой кодировке принимается текст от пользователя и в какой кодировке он пишется в базу не указано.
11 Мяв-Мяв
 
07.07.09
12:58
(9) он свое уже отработал.
12 sidalexsandr
 
07.07.09
13:02
Мяв-Мяв - у меня написанно в какой кодировке добавляются записи, все приведено в пункте 1).

PS
Пункт 2) программа только пока отображает.
13 smaharbA
 
07.07.09
13:05
(9) это относилось только к линукс/фрибсд и т.п.

(10) это вроде означает, что использовать любые за пределами ASCII
14 sidalexsandr
 
07.07.09
13:15
помогите
15 Мяв-Мяв
 
07.07.09
13:17
в пункте 1 у тебя написано "создать таблицу с первичным ключем и двумя текстовыми полями в кодировке по-умолчанию sqlite. потом записать в эту таблицу строку в юникоде наплевав на преобразования".
работа с различными кодировками - в главе 9 руководства sqlite
описание атрибута charset для типа данных varchar там же.
16 Мяв-Мяв
 
07.07.09
13:20
(13) нет, что все не совпадающее с ASCII писалось в UTF-8
при разработке в виндовс часто удобнее писать cp1251 (редакторы кривые)
в python3 упразднена.
17 sidalexsandr
 
07.07.09
13:26
Мяв-Мяв у тебя есть на русском руководство к sqlite3 ?
18 Мяв-Мяв
 
07.07.09
13:28
у меня его даже на английском нет. потому что сайт всегда доступен.
19 sidalexsandr
 
07.07.09
14:04
Мяв-Мяв Подскажи где написать и что в скрипте №1 , чтобы заносилось в utf-8 в русской кодирове и ещё в скрипте № 2 чтобы отображалось в русской кодировке
20 Мяв-Мяв
 
07.07.09
14:18
я не знаю что такое "русская кодировка"
совет создавать таблицу с хранением в utf уже дал
21 sidalexsandr
 
07.07.09
14:21
Мяв-Мяв пожалуйста напиши как создать таблицу с хранением в utf.
22 Мяв-Мяв
 
07.07.09
14:38
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
глава 9
http://dev.mysql.com/doc/refman/5.1/en/charset.html
пока не познакомишься с документацией смысла писать нет.
работать будет разве что случайно.
23 sidalexsandr
 
07.07.09
14:54
Мяв-Мяв в MySql и Sqlite3 одинаково реализована работа с кодировками ?
24 sidalexsandr
 
07.07.09
15:03
Исправил cur.execute('CREATE TABLE books (id INTEGER PRIMARY KEY, title VARCHAR(100), author CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin)')  


Пишет ошибку Operational error: no such table: books
25 kvk
 
07.07.09
15:21
(1) Может здесь помогут: http://forum.script-coding.info/
26 Мяв-Мяв
 
07.07.09
15:27
тьфу на меня. перепутал.
в скульлайт3 utf8 по-умолчанию.

в pysqlite3 незакрытая ошибка перекодировки.
27 Мяв-Мяв
 
07.07.09
15:36
фрагмент работы с utf
import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()

# Create the table
con.execute("create table person(lastname, firstname)")

AUSTRIA = u"\xd6sterreich"

# by default, rows are returned as Unicode
cur.execute("select ?", (AUSTRIA,))
row = cur.fetchone()
assert row[0] == AUSTRIA

# but we can make sqlite3 always return bytestrings ...
con.text_factory = str
cur.execute("select ?", (AUSTRIA,))
row = cur.fetchone()
assert type(row[0]) == str
# the bytestrings will be encoded in UTF-8, unless you stored garbage in the
# database ...
assert row[0] == AUSTRIA.encode("utf-8")

# we can also implement a custom text_factory ...
# here we implement one that will ignore Unicode characters that cannot be
# decoded from UTF-8
con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
cur.execute("select ?", ("this is latin1 and would normally create errors" +
                        u"\xe4\xf6\xfc".encode("latin1"),))
row = cur.fetchone()
assert type(row[0]) == unicode

# sqlite3 offers a builtin optimized text_factory that will return bytestring
# objects, if the data is in ASCII only, and otherwise return unicode objects
con.text_factory = sqlite3.OptimizedUnicode
cur.execute("select ?", (AUSTRIA,))
row = cur.fetchone()
assert type(row[0]) == unicode

cur.execute("select ?", ("Germany",))
row = cur.fetchone()
assert type(row[0]) == str
28 smaharbA
 
07.07.09
16:05
(27) о чем и речь была... тупо сознайся, что не писал для скулайта и на пайтоне )))
29 Мяв-Мяв
 
07.07.09
16:57
(28) если ты не знал - и для лайта и для мускуля питон использует один и тот же интерфейс - db api 2
а использование encode и явное указание кодировок - залог переносимости.

а вот os.environ тут совершенно не при чем.
30 smaharbA
 
07.07.09
17:38
(29) да хоть зачитайся лекций (енкод конечно когда перенос)

но ты не в курсе был до самого (27) )))

а вот енверон - ой как причем бывает и будет иначе будет либо си либо посикс
и чо ты будешь делать с файловыми операциями на коих в этих ос все зиждется.

любите вы пингвинофилы мути нагнать, не надо.
31 smaharbA
 
07.07.09
17:39
+(30) файловые операции в контексте поста ничего общего с файлами не имеют
32 Мяв-Мяв
 
07.07.09
17:48
(31) и где ты в корне файловые операции узрел?
ты хоть что-то на питоне писал?
любите вы пингвинофобы мути нагнать, не надо.
33 sidalexsandr
 
08.07.09
00:48
Мяв-Мяв - спасибо за строку 27 сообщение, но меня интересует с русским текстом.
34 trdm
 
08.07.09
01:02
(33)
Вот фрагмент работы с SQLite на с++/Qt:
bool uoMdRestructor::createNewMD()
{
   bool rezVal = false;
   qStartUpSet* llog = qStartUpSet::instance();

   QSqlDatabase m_db  = QSqlDatabase::addDatabase("QSQLITE","MDRestr");
   m_db.setDatabaseName(_fullPath);
   if (!m_db.open())
   {
       llog->writeToLog(QString(QObject::tr("Can not create meta db: \"%1\"")).arg(_fullPath));
       return false;
   }
   QStringList _tables =  m_db.tables();
   m_db.exec("PRAGMA encoding = \"UTF-8\"");


обрати внимание на последнюю строчку.
35 sidalexsandr
 
08.07.09
01:12
up
36 Мяв-Мяв
 
08.07.09
01:20
(33) с точки зрения utf русский и немецкий не отличается.
или ты хочешь чтобы я за тебя нужный тебе код написал?
37 quazare
 
08.07.09
06:44
(0) почему именно sqlite 3? Пробовали использовать sqlite 2.8?
Была у меня проблема с кодировкой (любой, была UTF-8) при работе  sqlite+flex  - некорректно отображались руc.символы, и таже самая база нормально отображалась в связке sqlite+air.
Вообще я так понимаю, проблема была именно встроенной реализации во флексе. Возможно, в питоне такая же проблема.
38 sidalexsandr
 
08.07.09
23:00
Помогите. Думал преподаватель в отпуск ушел а сегодня он сказал что будет завтро и хочет чтобы мы ему сдали. Полное попадалово... Помогите с русскими буквами.


PS
Я думал отдохнуть...
39 quazare
 
09.07.09
06:28
версию 2.8 применяй...
40 smaharbA
 
09.07.09
06:40
если это виндуз то попытайся так

cur.execute('INSERT INTO books (id, title, author) VALUES(1, "Mathematics", "'+unicode('Иванов', 'utf-8')+'")')

41 smaharbA
 
09.07.09
07:36
Коротко примерно так (пайтон 2.6, скулайт 3)


#!/usr/local/bin/python
# -*- coding: utf-8 -*-


import sqlite3

con = sqlite3.connect(":memory:")
cur = con.cursor()

locale='koi8-r'
charset='utf-8'

cur.execute('CREATE TABLE books (id INTEGER PRIMARY KEY, title VARCHAR(100), author VARCHAR(30))')
cur.execute('INSERT INTO books (id, title, author) VALUES(1, "Mathematics", "'+'Иванов'.decode(locale).encode(charset)+'")')

cur.execute('SELECT * FROM books')
for row in cur: print ''.join(row[2].split()).encode(locale)
con.commit()
cur.close()
42 smaharbA
 
09.07.09
07:36
кои8 заменишь на свою локаль