mysql`where`错误?

olmpazwi  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(286)

mysql数据库 WHERE 在处理像emojis这样的4字节字符时,似乎不能像预期的那样工作。以下是如何从mysql workbench复制:

-- Enable utf8mb4 in MySQL workbench
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';

CREATE TABLE `mytable` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `text` TEXT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4;

INSERT INTO `mytable` (`text`) VALUES
("ABC"), ("?"), ("?"), ("??");

SELECT `text` FROM `mytable`
WHERE `text` = "?";

预期结果

+------+
| text |
+------+
| ?   |
+------+

实际结果

+------+
| text |
+------+
| ?   |
| ?   |  <-- ??
+------+

我已经在5.6.32和5.7.20中验证了这种行为。
请告诉我发生了什么事。谢谢

6jygbczu

6jygbczu1#

您需要更新的排序规则:

SELECT "?"="?" COLLATE utf8mb4_unicode_520_ci;  --> 0
SELECT "?"="?" COLLATE utf8mb4_unicode_ci;  --> 1

“unicode\u ci”基于unicode 4.0unicode_520_ci“基于5.20版。
另请参见:https://stackoverflow.com/a/43692337

ie3xauqp

ie3xauqp2#

这不是一个mysql错误,而是一个关于collate是什么的很好的教训,正确设置它很重要。比较字符串时使用排序规则。
collate子句可以在select语句中使用

SELECT `text` FROM `mytable`
WHERE `text` COLLATE utf8mb4_bin = "?";

或者table被永久性地改变了

ALTER TABLE `mytable` 
CHANGE COLUMN `text` `text` TEXT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin' NULL DEFAULT NULL ;

它也可以在创建表时设置

CREATE TABLE `mytable` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `text` TEXT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

相关问题