MySQL 准备好的语句和区分大小写
MySQL prepared statements and case sensitivity
以前我用的是mysqliclass的query
方法。现在我正在使用 prepare 方法重写很多代码。
我有一个 table 排序规则 utf8mb4_bin
(区分大小写)但用户应该执行不区分大小写的查询,过去的查询是这个
SELECT SQL_CALC_FOUND_ROWS * FROM utenti WHERE nome LIKE _utf8mb4 ? COLLATE utf8mb4_unicode_ci ORDER BY id_utente ASC
我知道我不能将此语法用于准备好的语句,最好的方法是什么?我想强制存储值和查询值小写,但我认为这不是最好的方法。
您需要做的就是在 php 中将您的值转换为大写,并在查询中用 upper
包裹您的列。
select * from table where upper(column) like ?
与?被设置为您要查找的字符串的大写值。
您应该能够对列应用不区分大小写的排序规则,然后将其与您的参数进行比较:
SELECT * FROM utenti
WHERE nome COLLATE utf8mb4_unicode_ci LIKE ?
ORDER BY id_utente ASC
P.S.: 我建议删除 SQL_CALC_FOUND_ROWS
。如果您不使用 LIMIT
,它就没有任何意义。只会让性能变差
以前我用的是mysqliclass的query
方法。现在我正在使用 prepare 方法重写很多代码。
我有一个 table 排序规则 utf8mb4_bin
(区分大小写)但用户应该执行不区分大小写的查询,过去的查询是这个
SELECT SQL_CALC_FOUND_ROWS * FROM utenti WHERE nome LIKE _utf8mb4 ? COLLATE utf8mb4_unicode_ci ORDER BY id_utente ASC
我知道我不能将此语法用于准备好的语句,最好的方法是什么?我想强制存储值和查询值小写,但我认为这不是最好的方法。
您需要做的就是在 php 中将您的值转换为大写,并在查询中用 upper
包裹您的列。
select * from table where upper(column) like ?
与?被设置为您要查找的字符串的大写值。
您应该能够对列应用不区分大小写的排序规则,然后将其与您的参数进行比较:
SELECT * FROM utenti
WHERE nome COLLATE utf8mb4_unicode_ci LIKE ?
ORDER BY id_utente ASC
P.S.: 我建议删除 SQL_CALC_FOUND_ROWS
。如果您不使用 LIMIT
,它就没有任何意义。只会让性能变差