【问题标题】:MySQL transform case-sensitive unique field into unique case-insensitive fieldMySQL将区分大小写的唯一字段转换为唯一不区分大小写的字段
【发布时间】:2017-04-15 07:51:23
【问题描述】:

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

我有一个唯一但区分大小写的 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 

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

【问题讨论】:

  • 我很确定您可以更改字段的排序规则。
  • 大声笑你是对的,它有效。你想回答这个问题吗?

标签: mysql uniqueidentifier case-sensitive case-insensitive


【解决方案1】:

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

这应该会更改将它们与字符串文字和彼此进行比较的默认方式,但我不熟悉在比较不同排序规则的字段时使用的规则。

【讨论】:

  • 我将字段的排序规则从 utf8_unicode_ci 更改为 utf8_bin 并且所有 WHERE 和 JOIN 的行为都符合预期(区分大小写)
【解决方案2】:

这是来自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' 

【讨论】:

  • 我将字段的排序规则从 utf8_unicode_ci 更改为 utf8_bin 并且所有 WHERE 和 JOIN 的行为都符合预期(区分大小写)
猜你喜欢
  • 2021-07-11
  • 2011-12-08
  • 2012-12-09
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2023-03-27
  • 2016-11-12
相关资源
最近更新 更多