gpt4 book ai didi

mysql - 查询 MySQL 中的字符串比较精确

转载 作者:可可西里 更新时间:2023-11-01 06:43:09 24 4
gpt4 key购买 nike

我在 MySQL 中创建了这样的表:

DROP TABLE IF EXISTS `barcode`;
CREATE TABLE `barcode` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(40) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


INSERT INTO `barcode` VALUES ('1', 'abc');

INSERT INTO `barcode` VALUES ('2', 'abc ');

然后我从表条码中查询数据:

SELECT * FROM barcode WHERE `code` = 'abc ';

结果是:

+-----+-------+
| id | code |
+-----+-------+
| 1 | abc |
+-----+-------+
| 2 | abc |
+-----+-------+

但是我想要结果集只有1条记录。我的解决方法是:

SELECT * FROM barcode WHERE `code` = binary 'abc ';

结果为1条记录。但我将 NHibernate 与 MySQL 结合使用,以从映射表生成查询。那么如何解决这个案子呢?

最佳答案

没有其他修复方法。要么将单个比较指定为 binary,要么将整个数据库连接设置为 binary。 (执行 SET NAMES binary,这可能会产生其他副作用!)

基本上,“惰性”比较是 MySQL 的一个特性,它是硬编码的。要禁用它(按需!),您可以使用 binary 比较,您显然已经这样做了。这不是“解决方法”,而是真正的解决方法。

来自 MySQL Manual :

All MySQL collations are of type PADSPACE. This means that all CHAR and VARCHAR values in MySQL are compared without regard to any trailing spaces

当然,从用户的角度来看,还有很多其他的可能性可以达到相同的结果,即:

  • WHERE field = 'abc' AND CHAR_LENGTH(field) = CHAR_LENGTH('abc')
  • WHERE 字段 REGEXP 'abc[[:space:]]'

问题这些是它们实际上禁用了快速索引查找,因此您的查询总是导致全表扫描。巨大的数据集会产生很大的不同。

再次强调: PADSPACE 是 MySQL [VAR]CHAR 比较的默认值。您可以(并且应该)使用 BINARY 禁用它。这是这样做的预期方式。

关于mysql - 查询 MySQL 中的字符串比较精确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com