Mysql collate UTF8 стиль сравнения строк в Python

У меня есть следующая таблица 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  |
+--------+

Обратите внимание, что запись Луиза. На самом деле это "í". Как вы можете видеть, я определил параметры сортировки для поля имени в COLLATE utf8_unicode_ci. У меня есть сценарий Python, который загружает некоторые имена в эту таблицу, и так как имя поля уникально, а для параметра сортировки установлено значение utf8_unicode_ci, я не могу вставить Луизу в эту таблицу, поскольку она считает i и í одинаковыми. Теперь, чтобы проверить, присутствует ли запись уже в таблице на python, я изначально загружаю все имена, присутствующие в таблице, в набор и пытаюсь вставить только, если она уже отсутствует в таблице. Теперь проблема в том, что питон рассматривает меня и í как разные.

Я прочитал в http://www.cmlenz.net/archives/2008/07/the-truth-about-unicode-in-python что python не поддерживает сопоставление и что у нас есть реализация на языке uca, написанная Джеймс Таубер. Тем не менее, это помогает в сортировке, но не при сравнении, если две строки будут обрабатываться одинаково в mysql с помощью команды unfode uniCode.

Есть ли способ в Python для сравнения этих двух строк в MySQL?

2 ответа

Теперь, чтобы проверить, присутствует ли запись уже в таблице на python, я изначально загружаю все имена, присутствующие в таблице, в набор и пытаюсь вставить только, если она уже отсутствует в таблице.

Ты делаешь это неправильно. Либо выполните запрос к таблице, чтобы увидеть, существует ли запись, либо попробуйте вставить независимо и перехватить исключение.

Как насчет COLLATE utf8_bin?

Это для сравнения символов в двоичном формате (строгое сравнение).

Другие вопросы по тегам