Запрос MySQL с учетом регистра

Об этом уже спрашивали на этом сайте, но я не смог найти достаточного ответа. Если я делаю такой запрос:

Select Seller from Table where Location = 'San Jose'

Как сделать так, чтобы он возвращал только Продавцов с Локацией "Сан-Хосе" вместо "Сан-Хосе" или чего-то еще?


person Michael Liao    schedule 22.10.2011    source источник
comment
Используйте COLLATE.   -  person OMG Ponies    schedule 22.10.2011
comment
Главный ответ лучше, чем COLLATE, имо, потому что он проще.   -  person Buttle Butkus    schedule 13.10.2015


Ответы (3)


По умолчанию в запросах MySQL регистр не учитывается. Ниже приводится простой запрос, который ищет 'value'. Однако он вернет 'VALUE', 'value', 'VaLuE' и т. Д.

SELECT * FROM `table` WHERE `column` = 'value'

Хорошая новость заключается в том, что если вам нужно сделать запрос с учетом регистра, это очень просто сделать, используя _ 6_, который вызывает побайтовое сравнение:

SELECT * FROM `table` WHERE BINARY `column` = 'value'
person James mason    schedule 22.10.2011
comment
1) использование binary для этой цели рискованно, потому что буквально сравниваются байты двух строк. Если кодировка вашего сервера / сеанса по умолчанию не соответствует кодировке столбца, то символы ударения будут считаться не равными (т.е. ü в latin1 равно 0xFC, а в utf8mb4 - 0xC3Bc). 2) Как указывает ниже Shenxian, преобразование следует применять к параметру, а не к столбцу. Он будет иметь такой же функциональный эффект, но позволит запросу использовать индекс, если он присутствует в вашем столбце. - person Paul Wheeler; 24.05.2019

Чтобы улучшить отличный ответ Джеймса:

Вместо этого лучше поставить BINARY перед константой:

SELECT * FROM `table` WHERE `column` = BINARY 'value'

Помещение BINARY перед column предотвратит использование любого индекса в этом столбце.

person Shenxian    schedule 07.04.2016
comment
Как добавить в LIKE? - person Pablo Escobar; 02.09.2017
comment
@Purushotamrawat просто замените = на LIKE ... SELECT * FROM table WHERE column LIKE BINARY '% value%' - person NVG; 30.01.2018

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

В моем случае это означало определение моего столбца как:

`tag` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''

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

person Thomas Clowes    schedule 21.04.2016
comment
Я отредактировал, чтобы исправить то, что, я почти уверен, было глупой опечаткой, которая была прямо противоположной тому, что вы хотели сказать. Однако я чувствую, что должен уведомить вас (и поскольку это изменение состоит из двух символов, сайт не будет уведомлять вас автоматически). Предполагая, что вы довольны изменением, не стесняйтесь просто пометить мой комментарий как устаревший и позволить ему быть уничтоженным. (А если я облажался, кричи на меня.) - person Mark Amery; 26.09.2016
comment
Для более поздних версий MySql вы должны заменить устаревший utf8 на utf8mb4 - person Paul Wheeler; 24.05.2019