MySQL的枚举类型不区分大小写,它会匹配第一个不区分大小写的选项。

8
我有一个包含同一字母的小写和大写的枚举字段,当我尝试更新一行并更改值时,它不起作用。
这是重现问题的方法:
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在评论中提到的那样,它会使用第一个匹配项,如果我改变枚举的顺序并使用'G','g'等,则始终会使用G,您将无法将其更改回g。

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

5
文档中可以了解到:当检索ENUM列中的值时,将使用列定义中使用的大小写格式进行显示。请注意,ENUM列可以分配一个字符集和排序规则。对于二进制或区分大小写的排序规则,在给列赋值时将考虑大小写格式。因此,您需要更改列排序规则

5

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接