2016-11-30 57 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行为如预期(区分大小写) –