我试图在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()
这些函数不起作用......
有人可以帮忙吗?
答案 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;
}
}
的长度。