2016-11-30 21 views
0

這是因爲可以有多種方式來解決這個問題:)MySQL的變換大小寫敏感的獨特場打進唯一不區分大小寫場

我有一個ID列,它是獨一無二的,但區分大小寫的一個有趣的挑戰問題,例如:

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

如MySQL是在UTF8不區分大小寫,則考慮在兩個ID值視爲相同:

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函數,我可以AP簾布層此列所有的ID轉換成不區分大小寫獨特的ID,例如:

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

注:我不想使用排序規則,因爲我將不得不改變所有我的應用程序(Laravel PHP)中的WHERE s和JOIN。我想永久更改ID。

+0

我相當肯定你可以改變字段的排序規則。 – Uueerdo

+0

哈哈你是對的,它的工作原理。你想回答這個問題嗎? –

回答

1

這是從MySQL http://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html

爲了使非二進制字符串的區分大小寫的比較對大小寫不敏感 ,利用COLLATE僅舉區分大小寫排序。所述 串在下面的示例中,通常是大小寫敏感的,但 COLLATE改變所述比較是不區分大小寫:

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; 

還真

或使用二進制

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

我將字段從'utf8_unicode_ci'改爲'utf8_bin',所有的WHERE和JOIN都按照預期運行(區分大小寫) –

+0

@BassemLhm excellent .. well – scaisEdge

2

據官方MySQL documentation您可以設置每列基礎覈對(*請參閱CHAR,VARCHAR,TEXT DATA_TYPE部分, ENUM和SET類型)。

這應該改變它們與字符串文字以及相互比較的默認方式,但我不熟悉比較不同排序規則的字段時使用的規則。

+0

我將字段的排序規則從'utf8_unicode_ci'改爲'utf8_bin'和所有WHERE和JOIN行爲如預期(區分大小寫) –