MySQL 将区分大小写的唯一字段转换为不区分大小写的唯一字段
MySQL transform case-sensitive unique field into unique case-insensitive field
这是一个有趣的挑战性问题,因为可以有多种方法来解决这个问题:)
我有一个唯一但区分大小写的 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。
本文来自mysqlhttp://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html
To cause a case-sensitive comparison of nonbinary strings to be case
insensitive, use COLLATE to name a case-insensitive collation. The
strings in the following example normally are case sensitive, but
COLLATE changes the comparison to be case insensitive:
SET @s1 = 'MySQL' COLLATE latin1_bin;
SET @s2 = 'mysql' COLLATE latin1_bin;
SELECT @s1 = @s2;
return 假
使用@s1 整理 latin1_swedish_ci = @s2;
SELECT @s1 COLLATE latin1_swedish_ci = @s2;
return 正确
或使用二进制
SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkh'
SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkH'
根据官方 MySQL documentation,您可以在每列的基础上设置排序规则(*请参阅 data_type CHAR、VARCHAR、TEXT、ENUM 和 SET 类型部分).
这应该会改变它们与字符串文字以及相互比较的默认方式,但我不熟悉相互比较不同排序规则的字段时使用的规则。
这是一个有趣的挑战性问题,因为可以有多种方法来解决这个问题:)
我有一个唯一但区分大小写的 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。
本文来自mysqlhttp://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html
To cause a case-sensitive comparison of nonbinary strings to be case insensitive, use COLLATE to name a case-insensitive collation. The strings in the following example normally are case sensitive, but COLLATE changes the comparison to be case insensitive:
SET @s1 = 'MySQL' COLLATE latin1_bin;
SET @s2 = 'mysql' COLLATE latin1_bin;
SELECT @s1 = @s2;
return 假
使用@s1 整理 latin1_swedish_ci = @s2;
SELECT @s1 COLLATE latin1_swedish_ci = @s2;
return 正确
或使用二进制
SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkh'
SELECT COUNT(*) FROM table WHERE BINARY id='0018000001K6dkH'
根据官方 MySQL documentation,您可以在每列的基础上设置排序规则(*请参阅 data_type CHAR、VARCHAR、TEXT、ENUM 和 SET 类型部分).
这应该会改变它们与字符串文字以及相互比较的默认方式,但我不熟悉相互比较不同排序规则的字段时使用的规则。