mysql 枚举不区分大小写它匹配第一个不区分大小写
mysql enum is not case sensitive it match the first one without case-sensivity
我有 enum
字段,其中包含同一个字母的 lowercase
和 uppercase
,
当我尝试更新一行并更改它不起作用的值时。
这是重现问题的方式:
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');
现在,当我尝试将 strategy
从 g
更改为 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
来自doc:
When retrieved, values stored into an ENUM column are displayed using the lettercase that was used in the column definition. Note that ENUM columns can be assigned a character set and collation. For binary or case-sensitive collations, lettercase is taken into account when assigning values to the column.
所以你必须改变column collation。
我的解决方案是将排序规则更改为 ASCII:
ALTER TABLE `your_table` CHANGE `strategy` ENUM('g', 'G', 'r', 'R')
CHARACTER SET ASCII COLLATE ascii_bin NOT NULL DEFAULT 'g';
我有 enum
字段,其中包含同一个字母的 lowercase
和 uppercase
,
当我尝试更新一行并更改它不起作用的值时。
这是重现问题的方式:
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');
现在,当我尝试将 strategy
从 g
更改为 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
来自doc:
When retrieved, values stored into an ENUM column are displayed using the lettercase that was used in the column definition. Note that ENUM columns can be assigned a character set and collation. For binary or case-sensitive collations, lettercase is taken into account when assigning values to the column.
所以你必须改变column collation。
我的解决方案是将排序规则更改为 ASCII:
ALTER TABLE `your_table` CHANGE `strategy` ENUM('g', 'G', 'r', 'R')
CHARACTER SET ASCII COLLATE ascii_bin NOT NULL DEFAULT 'g';