2010-11-19 12 views
1

osx snow leopardにPython 2.6.1、mysql 5.1があります。Python - unicodeを挿入するmysqldbが失敗する

私のPythonコードでは接続しています。 use_unicode = Trueの場合、文字コード= "UTF8"

mysqlのは、だから我々はそこにすべての良いです私に

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) 

を伝えます。 私のテーブル構造がUTF8のように定義されて

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; 

私の文が

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

のようなものですが、Unicode文字列と私は

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

は私が手掛かり少ない午前エラーが発生します....

+0

URL列の照合とは? – Sam

+0

utf8_general_ci – Wizzard

答えて

2

問題はデータベースではありません。それはそれほど遠くない。あなたはここにPythonの文字列操作に依存している:

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

はこれを行うことはありません。ユニコード文字列をASCII文字列に挿入しようとしているだけでなく、SQLインジェクション攻撃にも自分自身を開放しているので、悪いことです。代わりに、この (あなたinsert機能を仮定するのMySQLdbでいくつかの呼び出しにマップ)ん:

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

違いは、あなたが今このように、彼らは適切にエンコードして引用されます確実に、値を挿入するためのMySQLdbを取得しているということです。

+0

申し訳ありませんが、私の間違いは、問題のコードが間違っていました。私はあなたが示すように、適切なテクニックを使用します、私はそれを私のプログラムで2行に分けました。またすみません。それで、それは別のものです。 – Wizzard

+0

その場合は、実際のコードと完全なトレースバックを表示してください。 –

+0

マークスの答えに私のコメントを見る....奇妙に思える – Wizzard

0

私にとっては、mysqlのデフォルト設定を変更します。の仕方? オープンmy.cnfと、次のように[mysqldを]セッションでの2行を追加します。

[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 

最後の2行(ライン38および39)は、私が追加するものです。 そして、mysqlサーバを再起動して、データベースとテーブルを作り直してください。 これを実行した後、動作するはずです。私はそれを試して、それはうまくいった。

関連する問題