mysql 中 Like 子句阿拉伯语字符串的日期类型问题


Date type issue with Like clause Arabic string in mysql

我在旧系统上工作,弹出窗口中的搜索是动态进行的。 例如,如果弹出字段: field1, field2, field3 并且用户在文本框中键入 كلمة 以进行搜索或任何阿拉伯语单词。 系统将创建一个动态搜索条件,如下所示:

field1 LIKE '%كلمة%' OR field2 LIKE '%كلمة%' OR field3 LIKE '%كلمة%'

当这些字段之一为日期类型时出现问题,在这种情况下给我 MySQL 错误:

非法混合整理以用于操作"喜欢">

当我将我搜索的单词更改为英语单词时,它会给我警告但工作正常,因为在这种情况下我不需要日期类型的字段(我搜索文本(。我也无法更改此动态搜索php函数的核心,因为所有系统都已构建,因此我不能像以下代码一样使用:

OR DATE_FORMAT(field1, '%Y-%m-%d') LIKE '%كلمة%'

因为我不知道哪个字段是Date类型,所以它是动态搜索。

此外,此问题仅在托管服务器上发生,而不是在我的本地主机上,我的主机是:Server version: 5.5.47-cll - MySQL Community Server (GPL),我的本地主机MySQL版本是:5.5.5

这是显示创建表脚本:

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

无论托管服务器上数据库的字符集是什么,当字符集utf8_general _ci或latin1_swedish_ci时,它都会产生此错误 提前谢谢。

当您在日期字段上使用like时,它们被视为拉丁字符串。假设您使用的是 utf8 字符集,您需要在like日期列之前convert日期列:

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 '%كلمة%'