gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:44:17 26 4
gpt4 key购买 nike

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

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

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

illegal mix of collations for operation 'like'

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

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

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

这个问题也只发生在托管服务器上,而不是在我的本地主机上,我的主机是:服务器版本: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 '%كلمة%'

关于php - mysql中Like子句阿拉伯字符串的日期类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34706130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com