这是一个有趣的挑战问题,因为有多种方法可以解决这个问题:)
我有一个唯一但区分大小写的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
注意:我不想使用排序规则,因为我必须更改应用程序中的所有WHERE
和JOIN
(Laravel PHP )。我想永久更改ID。
答案 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'