MySQL将区分大小写的唯一字段转换为独特的不区分大小写的字段

时间:2016-11-30 20:36:02

标签: mysql uniqueidentifier case-sensitive case-insensitive

这是一个有趣的挑战问题,因为有多种方法可以解决这个问题:)

我有一个唯一但区分大小写的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函数,我可以将其应用于此列,将所有ID转换为不区分大小写唯一 ID,例如:

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

注意:我不想使用排序规则,因为我必须更改应用程序中的所有WHEREJOIN(Laravel PHP )。我想永久更改ID。

2 个答案:

答案 0 :(得分:2)

根据官方MySQL documentation,您可以按列设置排序规则(*请参阅CHAR,VARCHAR, TEXT,ENUM和SET类型的data_type部分)。

这应该改变它们与字符串文字和彼此进行比较的默认方式,但是我不熟悉将不同整理的字段相互比较时使用的规则。

答案 1 :(得分: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;

返回false

使用@ s1 COLLATE latin1_swedish_ci = @ s2;

SELECT @s1 COLLATE latin1_swedish_ci = @s2;

返回true

或使用BINARY

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