【问题标题】:mysql enum is not case sensitive it match the first one without case-sensivitymysql 枚举不区分大小写,它匹配第一个不区分大小写的枚举
【发布时间】:2015-10-27 22:14:42
【问题描述】:

我有 enum 字段,其中包含同一字母的 lowercaseuppercase, 当我尝试更新一行并更改它不起作用的值时。

这是重现问题的方式:

CREATE TABLE `mytable` (
  `id` bigint(20) NOT NULL,
  `name` varchar(100) NOT NULL,
  `strategy` enum('g','G','r','R') NOT NULL DEFAULT 'g'
) ENGINE=InnoDB;

INSERT INTO `mytable` VALUES(1,'test','g');

现在,当我尝试将 strategyg 更改为 G 时,它不起作用:

UPDATE `mytable` SET `strategy`='G' WHERE id=1;

它返回:

Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

我用MySQL 5.5,请帮帮我

编辑:

正如@farshad 在他的评论中提到的, 它使用第一个匹配项,如果我更改enum 的顺序并使用'G','g',...,它将始终使用G,您不能将其改回g

【问题讨论】:

  • 这取决于枚举顺序。 Mysql返回第一个匹配的g字符,在我的测试中,当您将顺序更改为('G','g')时,所有带有'g'的行在所有情况下都返回'G'。我认为正确的问题是为什么mysql总是以区分大小写的枚举值返回第一个枚举字符

标签: mysql enums case-sensitive uppercase lowercase


【解决方案1】:

来自doc

检索时,存储在 ENUM 列中的值使用列定义中使用的字母大小写显示。请注意,可以为 ENUM 列分配字符集和排序规则。对于二进制或区分大小写的排序规则,在为列分配值时会考虑字母大小写。

所以你必须更改column collation

【讨论】:

    【解决方案2】:

    我的解决方案是将排序规则更改为 ASCII:

    ALTER TABLE `your_table` CHANGE `strategy` ENUM('g', 'G', 'r', 'R')
    CHARACTER SET ASCII COLLATE ascii_bin NOT NULL DEFAULT 'g';
    

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多