В таблице x
есть столбец со значениями u
и ü
.
SELECT * FROM x WHERE column='u'
.
Это возвращает u
И ü
, хотя я ищу только u
.
Сортировка таблицы utf8mb4_unicode_ci
. Где бы я ни читал о подобных проблемах, все предлагают использовать эту сортировку, потому что говорят, что utf8mb4
действительно покрывает ВСЕ СИМВОЛЫ. При таком сопоставлении должны быть решены все проблемы с набором символов и сопоставлением.
Я могу вставить ü
, è
, é
, à
, Chinese characters
и т. д. Когда я делаю SELECT *
, они также извлекаются и отображаются правильно.
Проблема возникает только тогда, когда я СРАВНИВАЮ две строки, как в приведенном выше примере (SELECT WHERE
), или когда я использую UNIQUE INDEX
в столбце. Когда я использую UNIQUE INDEX
, "ü"
не вставляется, когда у меня уже есть "u"
в столбце. Итак, когда SQL сравнивает u
и ü
, чтобы решить, является ли ü уникальной, он считает, что это то же самое, что и u
, и не вставляет ü
.
Я изменил все на utf8mb4
, потому что не хочу больше беспокоиться о наборах символов и сопоставлении. Однако кажется, что utf8mb4
тоже не является решением, когда дело доходит до СРАВНЕНИЯ строк.
Я также пробовал это: SELECT * FROM x WHERE _utf8mb4 'ü' COLLATE utf8mb4_unicode_ci = column
.
Этот код является исполняемым (выглядит довольно сложным). Однако он также возвращает ü
И u
.
Я разговаривал с некоторыми людьми в Индии и здесь, в Китае, по этому вопросу. Мы еще не нашли решения.
Если бы кто-нибудь смог разгадать тайну, было бы действительно здорово.
Add_On: прочитав все ответы и комментарии ниже, вот пример кода, который решает проблему:
SELECT * FROM x
WHERE 'ü' COLLATE utf8mb4_bin = column
Добавляя «COLLATE utf8mb4_bin» в запрос SELECT, SQL предлагает надевать «бинарные очки» (оканчивающиеся на _bin) при просмотре символов в столбце. С включенными бинарными очками SQL теперь видит двоичный код в столбце. И двоичный код отличается для каждой буквы, символа и смайлика, которые только можно придумать. Итак, SQL теперь также может видеть разницу между u и ü. Таким образом, теперь он возвращает только ü, когда запрос SELECT ищет ü и не возвращает u.
Таким образом, можно оставить все (сопоставление базы данных, сопоставление таблиц) без изменений, но добавить «COLLATE utf8mb4_bin» к запросу только тогда, когда требуется точное дифференцирование.
(На самом деле, SQL снимает все остальные очки (utf8mb4_german_ci, _general_ci, _unicode_ci и т. д.) и делает то, что он делает, только когда его не заставляют делать что-либо дополнительно. Он просто смотрит на двоичный код и не подстраивает свой поиск под какие-либо особый культурный фон.)
Спасибо всем за поддержку, особенно Pred.
u
иU
равными или разными? - person Álvaro González   schedule 12.12.2016