我已经成功地实现了Ignited-Datatables。但是,在输入"İ,ş,ğ,.."等"非拉丁"字符时,使用数据库进行搜索时
POST http://vproject.dev/module/user/ign_listing 500 (Internal Server Error)
详情如下:
Illegal mix of collations for operation 'like' while searching
... (u.id_user LIKE '%Ä°%' OR u.first_name LIKE '%Ä°%' OR u.last_name LIKE '%Ä°%' OR ue.email LIKE '%Ä°%' OR u.last_login LIKE '%Ä°%' ) ...
%Ä°%
部分会根据您键入的非拉丁字符而变化。
解决这个问题有什么想法吗?
我想出了问题所在。似乎是导致问题的日期时间字段。
.. ue.last_login '%ayşenur%'
给出Illegal mix of collations for operation 'like'
错误。当我DATETIME
字段中删除LIKE
部分时,不再有错误。我希望这有所帮助。
尝试以下操作:
u.id_user LIKE '%Ä°%' OR ... OR ... '%Ä°%' COLLATE utf8_bin
请参阅 MySQL Unicode 字符集
您也可以参考MySQL _bin和二进制排序规则以获取有关utf8_bin
的更多信息:
非二进制字符串(存储在 CHAR、VARCHAR 和 TEXT 数据中) 类型)具有字符集和排序规则。给定的字符集可以 具有多个排序规则,每个排序规则定义特定的排序 以及集合中字符的比较顺序。其中之一是 字符集的二进制排序规则,由_bin后缀指示 在排序规则名称中。例如,latin1 和 utf8 有二进制 名为 latin1_bin 和 utf8_bin 的排序规则。
这个问题有点老了。最后我找到了一个解决方案,将"喜欢"更改为"喜欢二进制"
我在数据表搜索ssp中遇到了同样的问题.class.php我通过转换为 UTF8 来解决,例如:
CONVERT(`user_datetime` USING utf8)
在 SSP.class.php 中修复:
$globalSearch[] = "CONVERT(`".$column['db']."` USING utf8) LIKE ".$binding;
我的最终代码是:
static function filter ( $request, $columns, &$bindings )
{
$globalSearch = array();
$columnSearch = array();
$dtColumns = self::pluck( $columns, 'dt' );
if ( isset($request['search']) && $request['search']['value'] != '' ) {
$str = $request['search']['value'];
for ( $i=0, $ien=count($request['columns']) ; $i<$ien ; $i++ ) {
$requestColumn = $request['columns'][$i];
$columnIdx = array_search( $requestColumn['data'], $dtColumns );
$column = $columns[ $columnIdx ];
if ( $requestColumn['searchable'] == 'true' ) {
$binding = self::bind( $bindings, '%'.$str.'%', PDO::PARAM_STR );
$globalSearch[] = "CONVERT(`".$column['db']."` USING utf8) LIKE ".$binding;
}
}
}
这为时已晚,但是,这是我的解决方法。
SELECT * FROM (SELECT DATE_FORMAT(some_date,'%d/%m/%Y') AS some_date FROM some_table)tb1
WHERE some_date LIKE '% $some_variable %'
日期时间/日期列为操作"like"的排序规则的非法混合提供了错误,因此,通过将其转换为另一个表实体,以前的列类型将替换为 varchar 类型。
此外,请确保在将任何列转换为临时表之前对其进行转换,以使匹配过程更加容易。
当LIKE
应用于DateTime
列时,我遇到了类似的错误。
所以现在,我不是使用简单的date_col LIKE '2019%'
而是使用CAST(date_col AS CHAR) LIKE '2019%'
.
该解决方案可在MySQL官方网站上找到。