MySQL без учета регистра совпадения строк с использованием = - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь искать записи, используя буквенно-цифровой столбец "short_code".Примерно так:

SELECT * FROM items WHERE short_code = "1AV9"

Без сортировки и с типом столбца, установленным на varchar (), этот запрос нечувствителен к регистру, поэтому он возвращает записи с короткими кодами 1av9, 1Av9 и т. Д. Я не хочу этого.

Итак, я попытался изменить параметры сортировки столбца short_code на utf8_bin, но теперь запрос вообще ничего не возвращает.Однако, если я изменю запрос на:

SELECT * FROM items WHERE short_code LIKE "1AV9%"

, тогда я получу именно ту строку, которую хочу.Возможно ли, что, преобразуя сопоставление моей колонки, она каким-то образом добавила невидимые символы в конце всех моих коротких кодов?Как я могу проверить / исправить это?

EDIT : похоже, что, изменив тип моего столбца на binary и попробовав кучу других вещей, он каким-то образом дополнил все мои short_codes нулямибайты, что объясняет, почему запрос не вернул никакого результата.После запуска и установки параметров сортировки utf8_bin все работает как положено.

Ответы [ 3 ]

1 голос
/ 10 октября 2011

Вот дикая догадка.Я думаю, что в таблице изначально не было набора параметров сортировки.Затем вы устанавливаете параметры сортировки на utf_bin, и это вызывает путаницу в сохраненной длине поля.

Сначала сделайте резервную копию вашего стола.Затем попробуйте:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(48) 
    CHARACTER SET 'utf8' 
    COLLATE 'utf8_unicode_ci'  ;

Добавление некоторых символов (которых нет в ваших данных):

UPDATE items 
SET short_code = CONCAT('++F++F', short_code, '++F++F') ;

Удаление их:

UPDATE items 
SET short_code = REPLACE(short_code, '++F++F', '') ;

Вернуться к длине 8:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(8) ;

И снова вернемся к двоичному сопоставлению:

ALTER TABLE items
  CHANGE COLUMN short_code short_code VARCHAR(8) 
    CHARACTER SET 'utf8' 
    COLLATE 'utf8_bin'  ;

Возможно, это исправит неверную длину.(возможно, более короткое изменение - от varchar к char и обратно к varchar - исправит это).

0 голосов
/ 10 октября 2011

Если вы можете изменить параметры сортировки, попробуйте "utf8_general_cs".

или, может быть,

WHERE '1AV9' COLLATE utf8_general_cs = short_code

0 голосов
/ 10 октября 2011

Попробуйте

SELECT LENGTH(short_code) FROM items WHERE short_code LIKE "1AV9%"

и посмотрите, получите ли вы в результате что-то отличное от 4.


Редактировать: Хм, ваши значения могут иметь пробелы. Попробуйте

SELECT * FROM items WHERE short_code = "1AV9    "

(это 1AV9 плюс четыре пробела) и посмотрите, если вы получите какие-либо результаты.

...