我正在尝试在用base64 (用于国际字符)编码的MySQL字段中查找字符串
常用搜索:
$sql = "SELECT * FROM table WHERE field LIKE '%term%' ";我已经尝试过了:
$sql = "SELECT * FROM table WHERE field name LIKE '%".base64_encode($term)."%' ";但它并不总是有效的,这取决于搜索词的长度...由于某种原因,每当我的项是奇数长时,它都会给出结果。
我也尝试过使用MySQL函数TO_BASE64()和FROM_BASE64(),但都不起作用……
有人能帮帮忙吗?
发布于 2014-01-07 02:08:38
您需要将输入值与base64解码的存储值进行比较,因此稍微取消对存储值调用FROM_BASE64()的尝试,并将其与普通输入值进行比较。如果对部分匹配进行了编码,则不能在$term中对其进行比较,因为部分值永远不会生成与完整存储值相同甚至相似的base64字符串。
SELECT * FROM `table` WHERE FROM_BASE64(`field`) LIKE '%$term%'在这个上下文中,$term是一个普通字符串,而不是base64编码的。当然,建议将$term作为绑定参数,而不是连接到查询中的普通PHP变量。
然而,这将是。如果您想要更改数据的存储方式,强烈建议您以未编码的形式存储数据。每个查询都需要对每一行进行base64解码才能找到匹配的行,这是非常低效的。
另请注意,TO_BASE64(),FROM_BASE64() were recently added in MySQL 5.6.1可能在许多安装中不可用。你真的应该改变数据存储的方式,以消除编码。
发布于 2015-04-28 14:59:11
如果您不想升级到MySQL 5.6或更高版本,您可以使用以下技巧来消除填充问题:
SELECT * FROM `table` WHERE
field LIKE '%" . base64_encode($term) . "%'
OR field LIKE '%" . substr(base64_encode($term .'a'),0,-4) . "%'
OR field LIKE '%" . substr(base64_encode($term .'aa'),0,-8) . "%'
OR field LIKE '%" . substr(base64_encode($term .'aaa'),0,-12) . "%'因此,避免了搜索项长度问题。根据$term的长度,您可以通过仅使用四个LIKE中的一个来优化此查询。
https://stackoverflow.com/questions/20956296
复制相似问题