查询时如何处理db中随机字母大小写实例?

Posted

技术标签:

【中文标题】查询时如何处理db中随机字母大小写实例?【英文标题】:How to deal with random letter upper and lower case instance in db when querying? 【发布时间】:2011-12-17 13:11:06 【问题描述】:

在数据库中通过字符串查询时,处理随机大小写字母的最佳方法是什么?

有没有一些标准的方法,或者我应该只允许数据库中的条目全部小写并稍后转换它们?

现在我在 php 中有这个查询:

    $get_category = "select category_name from categories where category_name = ".$some_var;

但不确定在处理可以是大写或小写的条目时它是否是最好的方法。

我使用 mysql

谢谢, 亚历克斯

【问题讨论】:

【参考方案1】:

MySQL 是否区分大小写取决于排序规则。选择以“_ci”结尾的排序规则(不区分大小写),对该列的查询将使用不区分大小写的比较。

另一种解决方案是使用UPPER 函数将列和搜索值转换为大写,但这样做会导致列上的任何索引都无法使用。

【讨论】:

嗨,不太熟悉排序规则。那是查询的一部分吗?还是表结构?我将如何做到这一点? 您能否提供一个示例或链接以获取有关“选择以 '_ci' 结尾的排序规则的更多信息?我的谷歌搜索尚未找到如何执行此操作。 它是表结构的一部分。您可以为每个数据库、表或列设置排序规则。您可以在 PHPMyAdmin 中选择它,或者使用 DDL 语句进行设置。这是关于排序规则的piece of information。还有here's how to set it. 也可以用 LIKE 指定 COLLATION。不确定其他情况。 @pst 谢谢indeed you can。尽管文档不清楚对性能的影响(更准确地说是使用索引)。我可以想象这消除了索引的使用,就像upper 所做的那样,但我不确定。【参考方案2】:

MySQL 的默认排序规则不区分大小写,因此 'Hello' 和 'HeLLo' 是相等的。如果需要将数据强制转换为一致的大小写,可以使用LOWER()UPPER() 字符串函数。

【讨论】:

【参考方案3】:

常见的模式是公平竞争,并使两个比较字符串大小写相同。例如:

$get_category = "select category_name from categories 
    where lower(category_name) = ".strtolower($some_var);

【讨论】:

【参考方案4】:

你也可以试试这个:

"select category_name from categories where LOWER(category_name) = LOWER(".$some_var.")";

但这可能会很慢(如果您将小写的 category_name 存储在数据库中会很快)。

【讨论】:

【参考方案5】:

我过去所做的,当我需要保留原始字符串的大小写(例如,登录名)时,创建另一列,其值标准化(全部大写或小写)。方式,我可以通过简单地将我要比较的字符串转换为相同的大小写来执行有效的比较。

如果性能不是问题(例如,不是很多数据),那么只需将 upper() 或 lower() 应用于 where 子句中的列即可。但这样做可以保证表扫描。

【讨论】:

【参考方案6】:

SQL 支持 COLLATION 序列,其中一些不区分大小写。 (我不知道 SQL 标准另有规定,但请查阅供应商文档。)

在这种情况下,请参阅 MySQL 手册中的 Case Sensitivity in String Searches。这是supported collations 的列表,其中_ci-后缀排序规则不区分大小写。

请注意,除了按表模式指定之外,还可以为查询中的 LIKE 运算符指定 COLLATION。

编码愉快。


并且,请,请,请使用占位符以保持 SQL 字符串整洁并避免 SQL 注入攻击!

【讨论】:

【参考方案7】:

您可以使用 UPPER sql 函数进行测试:

$get_category = "select category_name from categories where UPPER(category_name) = UPPER(".$some_var.");

但这确实是低效的。更好的方法是从一开始就将值存储为大写(或小写)。

编辑

您还应该真正考虑使用参数化查询,而不是简单地将变量连接到查询中。这有助于防止 SQL 注入攻击!

例如,您可以像这样准备和执行查询:

 $preparedStatement = $db->prepare('SELECT category_name FROM categories WHERE UPPER(category_name) = :category');
 $preparedStatement->execute(array(':category' => strtoupper($some_var)));
 $rows = $preparedStatement->fetchAll();

【讨论】:

以上是关于查询时如何处理db中随机字母大小写实例?的主要内容,如果未能解决你的问题,请参考以下文章

当您尝试去混淆奇怪的代码时如何处理名称冲突?

db关闭时如何处理flyway

在express中的每个数组元素中进行猫鼬查询时如何处理异步?

获取对象时如何处理“匹配查询不存在”

在电源查询中加载 CSV 时如何处理多个引号?

连接停止时如何处理猫鼬数据库