mysql - 如何正确比较 MySQL 文本字段与任意长度的字符串?

标签 mysql indexing

假设我有一个使用字符串作为主键的表。例如, 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/

相关文章:

MySql - 从多个表中选择联合或使用临时表更好吗?

php - 如何在 zend 框架中打印准确的 sql 查询?

php - 用于检测用户是否是特定用户组成员的自定义代码的小问题

java - 如何在非常大的 XML 文件中快速搜索/索引?

Mysql 取两行之间的数据

MySQL 在表之间移动数据,如果存在更新

python - 如何将大量数据附加到 Pandas HDFStore 并获得自然的唯一索引?

python - 在列表中切片元组(python)

python - pd.IndexSlice 列表

mysql - 外键和索引