Как работать с кавычками и апострофами для сравнения строк в MySQL, чтобы они соответствовали (сопоставление) - PullRequest
3 голосов
/ 08 декабря 2010

MySQL использует сопоставления для сравнения строк, поскольку некоторые символы должны соответствовать

Пример:

SELECT 'é' = 'e' COLLATE utf8_unicode_ci;
SELECT 'oe' = 'œ' COLLATE utf8_unicode_ci; 

оба возвращают true

Теперь, как я могу сделать то же самое скавычки (') против апострофов (')

Это не один и тот же символ, правильный символ, который следует использовать при написании "it" или "l'oiseau" (на французском языке), является апострофом.

Дело в том, что ни utf8_general_ci, ни utf8_unicode_ci не сопоставляют их.

Простое решение - хранить все в кавычках и заменять все апострофы, когда пользователь выполняет поиск, но это неправильно.

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

Как бы вы это сделали?

1 Ответ

1 голос
/ 08 декабря 2010

Пользовательское сопоставление представляется наиболее подходящим, но если это невозможно, возможно, вы могли бы приспособить свои поиски к использованию регулярных выражений. Это не совсем идеально, но может быть полезно в некоторых ситуациях. По крайней мере, он позволяет хранить данные в правильном формате (без необходимости заменять кавычки) и просто выполнять замены в самом поисковом запросе:

INSERT INTO mytable VALUES
(1, 'Though this be madness, yet there is method in ''t'),
(2, 'Though this be madness, yet there is method in ’t'),
(3, 'There ’s daggers in men’s smiles'),
(4, 'There ’s daggers in men''s smiles');

SELECT * FROM mytable WHERE data REGEXP 'There [\'’]+s daggers in men[\'’]+s smiles';

+----+--------------------------------------+
| id | data                                 |
+----+--------------------------------------+
|  3 | There ’s daggers in men’s smiles     |
|  4 | There ’s daggers in men's smiles     |
+----+--------------------------------------+

SELECT * FROM mytable WHERE data REGEXP 'Though this be madness, yet there is method in [\'’]+t';

+----+-----------------------------------------------------+
| id | data                                                |
+----+-----------------------------------------------------+
|  1 | Though this be madness, yet there is method in 't   |
|  2 | Though this be madness, yet there is method in ’t   |
+----+-----------------------------------------------------+
...