我在旧系统上工作,弹出搜索是动态的.例如,如果弹出字段:field1, field2, field3
和用户在搜索文本框中键入كلمة或任何阿拉伯语单词.系统将创建一个动态搜索条件,如下所示:
field1 LIKE '%????%' OR field2 LIKE '%????%' OR field3 LIKE '%????%'
当其中一个字段是日期类型时出现问题,在这种情况下给我mysql错误:
操作'喜欢'的非法混合排序
当我改变我搜索的单词是英文单词时,它会给我警告但是工作正常,因为在这种情况下我不需要日期类型的字段(我搜索文本).我也无法改变这个动态搜索php函数的核心,因为所有系统都是构建的,所以我不能像这样代码使用:
OR DATE_FORMAT(field1, '%Y-%m-%d') LIKE '%????%'
因为我不知道哪个字段是一个Date
类型,所以它是一个动态搜索.
此问题也只发生在托管服务器上,而不是在我的localhost上,我的主机是:Server version: 5.5.47-cll - MySQL Community Server (GPL)
我的localhost mysql版本是:5.5.5
.
这是show create table脚本:
CREATE TABLE `POS_QUOTATIONS` ( `DEPT_ID` varchar(20) NOT NULL, `BILL_TYPE` int(11) NOT NULL, `BILL_NUMBER` int(11) NOT NULL, `BILL_NUMBER_TO_RTRN` int(11) NOT NULL, `SALESPERSON_NAME` varchar(255) NOT NULL, `BILL_DATE` date NOT NULL, `POS_ID` int(11) NOT NULL, `STOCK_ID` varchar(20) NOT NULL, `CURRENCY_ID` varchar(3) NOT NULL, `EXCHANGE_RATE` float NOT NULL, `SALESPERSON_TYPE` int(1) NOT NULL, `SALESPERSON_ID` int(10) NOT NULL, `CLIENT_TYPE` int(1) NOT NULL, `ACC_CODE` varchar(20) NOT NULL, `CLIENT_NAME` varchar(255) NOT NULL, `CLIENT_APPROVAL_NUMBER` varchar(20) NOT NULL, `NOTES` varchar(255) NOT NULL, `BILL_VALUE_BEFORE_DISCOUNT` double NOT NULL, `OVRALL_COST` double DEFAULT '0', `SALES_TAX` double NOT NULL, `ADITIONAL_AMOUNT` double NOT NULL, `DISCOUNT_PERCENTAGE` double NOT NULL, `DISCOUNT_AMOUNT` double NOT NULL, `BILL_VALUE_AFTER_DISCOUNT` double NOT NULL, `CLIENT_PAYMENT` decimal(13,2) NOT NULL, `REMAINING_AMOUNT` decimal(13,2) NOT NULL, `PAYMENT_METHOD` int(11) NOT NULL, `CREDIT_CARD_DETAILS` varchar(255) NOT NULL, `BANK_OPERATION_NUMBER` varchar(50) NOT NULL, `BANK_DETAILS` varchar(255) NOT NULL, `BANK_ACC_CODE` varchar(20) NOT NULL, `PAYMENT_METHOD_INFO` varchar(500) NOT NULL, `CONTRACT_PRODUCT_DETAILS` text NOT NULL, `CONTRACT_REC_VOUCHER_NO` varchar(255) NOT NULL, `CONTRACT_REPAYMENT_DATE` varchar(255) NOT NULL, `ROWID` varchar(255) NOT NULL, `YEAR` int(4) NOT NULL, `CREATION_USER` varchar(10) DEFAULT NULL, `CREATION_TIMESTAMP` varchar(14) DEFAULT NULL, `CREATION_COMPUTER_NAME` varchar(50) DEFAULT NULL, `LASTUPDATE_USER` varchar(10) DEFAULT NULL, `LASTUPDATE_TIMESTAMP` varchar(50) DEFAULT NULL, `LASTUPDATE_COMPUTER_NAME` varchar(50) DEFAULT NULL, `TRANS_FLAG` varchar(10) DEFAULT NULL, `RECORD_STATUS` varchar(1) DEFAULT NULL, `JOURNAL_STATUS` tinyint(1) DEFAULT NULL, `PROCESS_NUMBER` varchar(50) DEFAULT NULL, `OFFER_TERMS` text, `TECHNICAL_SPECIFICATIONS` text, `OFFER_STATUS` tinyint(1) DEFAULT NULL, `PROJECT_DESCRIPTION` varchar(500) DEFAULT NULL, `POS_CONTRACT_AGREEMENT_ID` varchar(50) DEFAULT NULL, `COST_CENTER_CODE` varchar(50) DEFAULT NULL, PRIMARY KEY (`ROWID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
无论托管服务器上的数据库是什么字符集,它都会在charset为utf8_general
_ci或latin1_swedish_ci
提前感谢时产生此错误.
like
在日期字段上使用时,它们被视为拉丁字符串.假设您使用的是utf8字符集,则需要convert
在like
其之前使用日期列:
convert(field1 using utf8) LIKE '%????%' OR convert(field2 using utf8) LIKE '%????%' OR convert(field3 using utf8) LIKE '%????%'
理想情况下,如果您在此处添加一些逻辑并有条件date
地仅将转换应用于字段.例如,如果您知道field2是唯一的date
字段,则可以构建查询:
field1 LIKE '%????%' OR convert(field2 using utf8) LIKE '%????%' OR field3 LIKE '%????%'