需要帮助搜索base64编码的MySQL字段

时间:2014-01-06 18:03:03

标签: mysql base64

我试图在MySQL字段中找到一个用base64编码的字符串(对于国际字符)

通常搜索:

$sql = "SELECT * FROM table WHERE field LIKE '%term%' ";

我试过这个:

$sql = "SELECT * FROM table WHERE field name LIKE '%".base64_encode($term)."%'  ";

但它一直不起作用,取决于搜索词的长度......出于某种原因,只要我的术语是奇数长,它就会得到结果...

我也尝试过使用MySQL函数TO_BASE64()FROM_BASE64()这些函数不起作用......

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

您需要将输入值与base64解码的存储值进行比较,因此请稍微反转您的尝试,以便对存储的值调用FROM_BASE64()并与普通输入值进行比较。如果编码,则无法比较$term中的部分匹配,因为部分值永远不会产生与完整存储值相同或甚至相似的base64字符串。

SELECT * FROM `table` WHERE FROM_BASE64(`field`) LIKE '%$term%'

在此上下文中,$term是纯字符串,而不是base64编码。当然建议$term是一个绑定参数,而不是连接到查询中的普通PHP变量。

然而,这将是 。如果您可以更改数据的存储方式,我们强烈建议您以简单的未编码形式存储它。每个查询都需要对每个行进行base64-decode 以找到匹配的行,这是非常低效的。

另请注意,TO_BASE64(),FROM_BASE64() were recently added in MySQL 5.6.1,因此可能无法在许多安装中使用。你真的应该改变存储数据的方式来消除编码。

答案 1 :(得分:0)

如果您不想升级到MySQL 5.6或更高版本,可以使用以下技巧来消除填充问题:

LIKE

因此避免了搜索词长度问题。您可以仅使用四个$term中的一个来优化此查询,具体取决于 public bool IsValidTotalHours(int month, int year) { try { GLLogger.WriteDebugEntry(string.Format("In {0} method.", MethodBase.GetCurrentMethod().Name), "LoggingCategory"); TimeSpan ts; int NoOfDays = DateTime.DaysInMonth(year, month); int TotalHoursInCurrentMonth = NoOfDays * 24; int iHrsEntranceExitMeeting = Convert.ToInt32(!string.IsNullOrEmpty(txtEntranceExitMeetingHrs.Text) ? txtEntranceExitMeetingHrs.Text : "00"); int iHrsQAandAMeetings = Convert.ToInt32(!string.IsNullOrEmpty(txtQAAndAMeetingsHrs.Text) ? txtQAAndAMeetingsHrs.Text : "00"); int iHrsGeneralMeetings = Convert.ToInt32(!string.IsNullOrEmpty(txtGeneralMeetingsHrs.Text) ? txtGeneralMeetingsHrs.Text : "00"); int iHrsInServices = Convert.ToInt32(!string.IsNullOrEmpty(txtInServicesHrs.Text) ? txtInServicesHrs.Text : "00"); int iHrsDrugDestruction = Convert.ToInt32(!string.IsNullOrEmpty(txtDrugDestructionHrs.Text) ? txtDrugDestructionHrs.Text : "00"); int iHrsDriveTime = Convert.ToInt32(!string.IsNullOrEmpty(txtDriveTimeHrs.Text) ? txtDriveTimeHrs.Text : "00"); int iHrsMSSA = Convert.ToInt32(!string.IsNullOrEmpty(txtMSSAHrs.Text) ? txtMSSAHrs.Text : "00"); int iHrsMedPass = Convert.ToInt32(!string.IsNullOrEmpty(txtMedPassHrs.Text) ? txtMedPassHrs.Text : "00"); int iHrsMedRoomInspection = Convert.ToInt32(!string.IsNullOrEmpty(txtMedRoomInspectionHrs.Text) ? txtMedRoomInspectionHrs.Text : "00"); int iHrsMRR_Time = Convert.ToInt32(!string.IsNullOrEmpty(txtMRRTimeHrs.Text) ? txtMRRTimeHrs.Text : "00"); int iHrsReportPrepAndPrint = Convert.ToInt32(!string.IsNullOrEmpty(txtReportPrepAndPrintHrs.Text) ? txtReportPrepAndPrintHrs.Text : "00"); int iHrsShortStay_COC_Time = Convert.ToInt32(!string.IsNullOrEmpty(txtShortStayOrCOCHrs.Text) ? txtShortStayOrCOCHrs.Text : "00"); int iTotalHours = iHrsEntranceExitMeeting + iHrsQAandAMeetings + iHrsGeneralMeetings + iHrsInServices + iHrsDrugDestruction + iHrsDriveTime + iHrsMSSA + iHrsMedPass + iHrsMedRoomInspection + iHrsMRR_Time + iHrsReportPrepAndPrint + iHrsShortStay_COC_Time; int iMinEntranceExitMeeting = Convert.ToInt32(!string.IsNullOrEmpty(txtEntranceExitMeetingMins.Text) ? (Convert.ToInt32(txtEntranceExitMeetingMins.Text) < 10 ? txtEntranceExitMeetingMins.Text.PadLeft(2, '0') : txtEntranceExitMeetingMins.Text) : "00"); int iMinQAandAMeetings = Convert.ToInt32(!string.IsNullOrEmpty(txtQAAndAMeetingsMins.Text) ? (Convert.ToInt32(txtQAAndAMeetingsMins.Text) < 10 ? txtQAAndAMeetingsMins.Text.PadLeft(2, '0') : txtQAAndAMeetingsMins.Text) : "00"); int iMinGeneralMeetings = Convert.ToInt32(!string.IsNullOrEmpty(txtGeneralMeetingsMins.Text) ? (Convert.ToInt32(txtGeneralMeetingsMins.Text) < 10 ? txtGeneralMeetingsMins.Text.PadLeft(2, '0') : txtGeneralMeetingsMins.Text) : "00"); int iMinInServices = Convert.ToInt32(!string.IsNullOrEmpty(txtInServicesMins.Text) ? (Convert.ToInt32(txtInServicesMins.Text) < 10 ? txtInServicesMins.Text.PadLeft(2, '0') : txtInServicesMins.Text) : "00"); int iMinDrugDestruction = Convert.ToInt32(!string.IsNullOrEmpty(txtDrugDestructionMins.Text) ? (Convert.ToInt32(txtDrugDestructionMins.Text) < 10 ? txtDrugDestructionMins.Text.PadLeft(2, '0') : txtDrugDestructionMins.Text) : "00"); int iMinDriveTime = Convert.ToInt32(!string.IsNullOrEmpty(txtDriveTimeMins.Text) ? (Convert.ToInt32(txtDriveTimeMins.Text) < 10 ? txtDriveTimeMins.Text.PadLeft(2, '0') : txtDriveTimeMins.Text) : "00"); int iMinMSSA = Convert.ToInt32(!string.IsNullOrEmpty(txtMSSAMins.Text) ? (Convert.ToInt32(txtMSSAMins.Text) < 10 ? txtMSSAMins.Text.PadLeft(2, '0') : txtMSSAMins.Text) : "00"); int iMinMedPass = Convert.ToInt32(!string.IsNullOrEmpty(txtMedPassMins.Text) ? (Convert.ToInt32(txtMedPassMins.Text) < 10 ? txtMedPassMins.Text.PadLeft(2, '0') : txtMedPassMins.Text) : "00"); int iMinMedRoomInspection = Convert.ToInt32(!string.IsNullOrEmpty(txtMedRoomInspectionMins.Text) ? (Convert.ToInt32(txtMedRoomInspectionMins.Text) < 10 ? txtMedRoomInspectionMins.Text.PadLeft(2, '0') : txtMedRoomInspectionMins.Text) : "00"); int iMinMRR_Time = Convert.ToInt32(!string.IsNullOrEmpty(txtMRRTimeMins.Text) ? (Convert.ToInt32(txtMRRTimeMins.Text) < 10 ? txtMRRTimeMins.Text.PadLeft(2, '0') : txtMRRTimeMins.Text) : "00"); int iMinReportPrepAndPrint = Convert.ToInt32(!string.IsNullOrEmpty(txtReportPrepAndPrintMins.Text) ? (Convert.ToInt32(txtReportPrepAndPrintMins.Text) < 10 ? txtReportPrepAndPrintMins.Text.PadLeft(2, '0') : txtReportPrepAndPrintMins.Text) : "00"); int iMinShortStay_COC_Time = Convert.ToInt32(!string.IsNullOrEmpty(txtShortStayOrCOC_Mins.Text) ? (Convert.ToInt32(txtShortStayOrCOC_Mins.Text) < 10 ? txtShortStayOrCOC_Mins.Text.PadLeft(2, '0') : txtShortStayOrCOC_Mins.Text) : "00"); int iTotalMinutes = iMinEntranceExitMeeting + iMinQAandAMeetings + iMinGeneralMeetings + iMinInServices + iMinDrugDestruction + iMinDriveTime + iMinMSSA + iMinMedPass + iMinMedRoomInspection + iMinMRR_Time + iMinReportPrepAndPrint + iMinShortStay_COC_Time; ts = new TimeSpan(iTotalHours, iTotalMinutes, 0); if (ts.TotalHours > TotalHoursInCurrentMonth || (ts.TotalHours == TotalHoursInCurrentMonth && ts.Minutes > 0)) return false; else return true; } catch (Exception exception) { GLExceptionPolicy.HandleException(exception, PolicyType.CONTROLLER_EXCEPTION_POLICY, 1, MethodBase.GetCurrentMethod().Name); GLLogger.WriteErrorEntry(exception.Message, MethodBase.GetCurrentMethod().Name, 1, null, "LoggingCategory"); return false; } } 的长度。