2010-11-19 25 views
1

Python 2.6.1, mysql 5.1 osx kar leoparı üzerinde.Python - mysqldb takma unicode hatası

Bağlantı kurmak için python kodumda yapıyorum; use_unicode = Doğru, charset = "utf8"

MySQL Yani orada bütün iyi bana

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) 

söyler. Benim tablo yapısı utf8 olarak tanımlanır

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; 

My açıklamada

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

gibidir ama unicode dize ile ben

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

ben ipucu daha az duyuyorum bir hatayla ....

+0

URL sütunu karşılaştırması nedir? – Sam

+0

utf8_general_ci – Wizzard

cevap

2

Sorun, veritabanınız değil. Bu kadar uzak bile değil. Burada Python'un dize manipülasyon güvenmek:

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

bunu asla. Kötü çünkü bir ASCII'ye bir unicode dizesi eklemek için değil, aynı zamanda SQL enjeksiyon saldırılarına açık kendinizi bırakıyorsunuz. Bunun yerine, bu (MySQLdb bazı çağrıya sizin insert fonksiyon haritalar varsayarak) yapın:

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

fark, artık böylece kodlanmış ve düzgün alıntı edilecektir sağlanması değerlerini eklemek için MySQLdb elde olmasıdır.

+0

Maalesef hatam, sorudaki kodum yanlıştı. Gösterdiğin gibi uygun tekniği kullanıyorum, programımda iki satırda ayrılıyorum. Tekrar özür dilerim. Yani, başka bir şey. – Wizzard

+0

Bu durumda, lütfen gerçek kodu ve tam izini gösteriniz. –

+0

Marks yanıtı hakkındaki yorumumu gör .... garip görünüyor – Wizzard

0

Benim için varsayılan mysql ayarını değiştiririm. Nasıl? Böyle oturumda [mysqld] içinde my.cnf açma ve ekleme iki satır:

[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 

son iki satır (hat 38 ve 39) ben eklemek şeylerdir. Ve sonra, mysql sunucusunu yeniden başlatın ve veritabanı ve tabloları yeniden oluşturmayı unutmayın. Bunu yaptıktan sonra, çalışması gerektiğini düşünüyorum. Denedim ve işe yaradı.