假设我有一个使用字符串作为主键的表。例如, session 表(我将其保留为 4 个字符,以便使示例更清晰)。
我还将添加一个自动增量列,以使我的示例更接近现实(以防有所不同)。
CREATE TABLE sessions (
`id` INT AUTO INCREMENT,
`key` CHAR(4) NOT NULL,
PRIMARY KEY(`key`),
UNIQUE KEY `idx_key` ( `key` )
);
我可以将数据插入表中。
INSERT INTO sessions (`key`) VALUES ('abcd');
因为这是一个来自浏览器的 session ID,所以我不信任它并在处理请求的代码中使用正确的绑定(bind)值。恶意用户可以在此处发送各种字符串,但它们始终会以字符串形式结束,而不是注入(inject)攻击。没关系。 MySQL 会很乐意截断这些数据并发出警告。
INSERT INTO sessions(`key`) VALUES ('abcdefg');
Warning (Code 1265): Data truncated for column 'key' at row 1
但是,这对于创建行来说只是“很好”(不是很好,但无论如何)。相同的操作首先查找一行,然后再尝试插入它。你知道 - upsert。 MySQL 不会去截断这个数据,并且认为它不在表中。
SELECT * FROM sessions WHERE `key` = 'abcdefg';
Empty set (0.00 sec)
这意味着我之前的插入更加糟糕,因为当我插入数据时,MySQL 会将其截断为确实存在的值。
INSERT INTO sessions (`key`) VALUES ('abcdefg');
Warning (Code 1265): Data truncated for column 'key' at row 1
Error (Code 1062): Duplicate entry 'abcd' for key 'idx_key'
网站代码不知道此列的约束,我无意向其提供此信息。
如何让 MySQL 只比较字符串的前 N 个字符,其中 N 是文本字段的(最大)长度?
最佳答案
您可以使用SUBSTRING
方法。
给定 N 是文本字段的(最大)长度,您可以说
SELECT * FROM sessions WHERE `key` = SUBSTRING('abcdefg', 1, N)
如果 N = 4 那么我们有
SELECT * FROM sessions WHERE `key` = SUBSTRING('abcdefg', 1, 4)
关于mysql - 如何正确比较 MySQL 文本字段与任意长度的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508931/