2016-11-30 3 views
0

Это интересный вызов вопрос может быть несколько способов решить эту проблему :)MySQL преобразования регистрозависимое уникальное поле в уникальном регистронезависимом поле

У меня есть столбец ID, который является уникальным, но чувствителен к регистру , например:

----- ID ------ 
0018000001K6dkh -> record 1 
0018000001K6dkH -> record 2 (different from record 1) 

Как MySQL нечувствителен к регистру в utf8, он рассматривает два значения идентификатора как идентичные:

SELECT COUNT(*) FROM table WHERE id='0018000001K6dkh' //returns 2 instead of 1 
SELECT COUNT(*) FROM table WHERE id='0018000001K6dkH' //returns 2 instead of 1 

Мне нужно построить функцию MySQL, что я могу ар сгибают в этой колонке, чтобы преобразовать все идентификаторы в не чувствительны к регистру и уникальные идентификаторы, напр:

function('0018000001K6dkh') = something 
function('0018000001K6dkH') = something different 
function('0018000000ttzlB') = something even different 
function('0018000000tTzlB') = something even more different 

Примечание: Я не хочу, чтобы использовать параметры сортировки, потому что я должен был бы изменить все WHERE s и JOIN s в моем приложении (Laravel PHP). Я хочу постоянно менять идентификаторы.

+0

Я уверен, что вы можете изменить сортировку поля. – Uueerdo

+0

lol Вы правы, это работает. Вы хотите ответить на вопрос? –

ответ

1

Это из MySQL http://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html

Чтобы вызвать чувствительны к регистру сравнению строк небинарных быть случаю нечувствительных, использование СОРТИРОВКИ назвать регистронезависимую сверку. В строки в следующем примере, обычно чувствителен к регистру, но СОЪЪАТ изменяет сравнение, чтобы быть чувствителен к регистру:

SET @s1 = 'MySQL' COLLATE latin1_bin; 
SET @s2 = 'mysql' COLLATE latin1_bin; 
SELECT @s1 = @s2; 

возвращение ложного

с помощью @ s1 COLLATE latin1_swedish_ci = @ s2;

SELECT @s1 COLLATE latin1_swedish_ci = @s2; 

возвращающие

или использовать BINARY

SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkh' 
SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkH' 
+0

Я изменил сопоставление поля с 'utf8_unicode_ci' до' utf8_bin', и все WHERE и JOINs ведут себя как ожидалось (с учетом регистра) –

+0

@BassemLhm excellent .. well – scaisEdge

2

По официальным MySQL documentation вы можете установить параметры сортировки на каждый столбец основе (* см DATA_TYPE раздел CHAR, VARCHAR, TEXT, ENUM и SET).

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

+0

Я изменил сопоставление поля с 'utf8_unicode_ci' до 'utf8_bin', и все WHERE и JOINs ведут себя как ожидалось (с учетом регистра) –

Смежные вопросы