3

次のMySQLテーブルがあります

mysql> show create table names;
+-------+-----------------------------------------------------+
| Table | Create Table                                        |
+-------+----------------------------- -----------------------+
| names | CREATE TABLE `names` (
`name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  |
+-------+-----------------------------------------------------+

現在、テーブルには次のレコードがあります

mysql> select * from names;
+--------+
| name   |
+--------+
| Luísa  |
+--------+

エントリがLuísaであることに注意してください。それは実際には「イー」です。ご覧のとおり、name フィールドの照合を COLLATE utf8_unicode_ci に指定しました。このテーブルにいくつかの名前をロードする Python スクリプトがあり、フィールド名が一意であり、照合順序が utf8_unicode_ci に設定されているため、iíが同じであると見なされるため、このテーブルにLuisaを挿入できません。

ここで、エントリがPythonのテーブルに既に存在するかどうかを確認するために、最初にテーブルに存在するすべての名前をセットにロードし、テーブルに存在しない場合にのみ挿入しようとします。問題は、python がiíを異なるものとして扱っていることです。

http://www.cmlenz.net/archives/2008/07/the-truth-about-unicode-in-pythonで、Python は照合をサポートしていないこと、およびによって書かれた uca の Python 実装があることを読みました 。ジェームズ・タウバー。ただし、これはソートには役立ちますが、MySQL で utf8 Unicode CI 照合を使用して 2 つの文字列が同じように扱われるかどうかを比較する場合には役立ちません。

Python でこれら 2 つの文字列を MySQL の方法で比較する方法はありますか?

4

2 に答える 2

0

ここで、エントリがPythonのテーブルにすでに存在するかどうかを確認するために、最初にテーブルに存在するすべての名前をセットでロードし、テーブルにまだ存在しない場合にのみ挿入しようとします。

あなたはそれを間違っています。テーブルに対してクエリを実行してエントリがすでに存在するかどうかを確認するか、関係なく挿入して例外をキャッチしてください。

于 2012-12-26T08:30:05.377 に答える
0

どうCOLLATE utf8_binですか?

バイナリ形式の文字を比較するためのものです(厳密な比較)。

于 2012-12-26T08:31:15.080 に答える