使用 Ignited-Datatables 搜索时非法混合排序规则以进行“like”操作

Posted

技术标签:

【中文标题】使用 Ignited-Datatables 搜索时非法混合排序规则以进行“like”操作【英文标题】:Illegal mix of collations for operation 'like' while searching with Ignited-Datatables 【发布时间】:2013-09-08 20:39:47 【问题描述】:

我已经成功实现了 Ignite-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 '%Ä°%' ) ...

%Ä°% 部分会根据您键入的非拉丁字符而变化。

有解决这个问题的办法吗?

【问题讨论】:

一种选择是使用convert(datefield using utf-8)... 【参考方案1】:

我在数据表搜索 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;
            
        
    

【讨论】:

【参考方案2】:

LIKE 应用于DateTime 列时,我遇到了类似的错误。 所以现在,我不使用简单的date_col LIKE '2019%',而是使用CAST(date_col AS CHAR) LIKE '2019%'

解决方法在官方mysql bugs website上找到。

【讨论】:

【参考方案3】:

这个问题有点老了。 最后我找到了一个解决方案,将“LIKE”更改为“LIKE binary”

【讨论】:

【参考方案4】:

我知道这为时已晚,但是,这是我的解决方法。

SELECT * FROM (SELECT DATE_FORMAT(some_date,'%d/%m/%Y') AS some_date FROM some_table)tb1
WHERE some_date LIKE '% $some_variable %'

datetime/date 列给出了 Illegal mix of collat​​ions for operation 'like' 的错误,因此,通过将其转换为另一个表实体,之前的列类型将被替换为 varchar 类型。

另外,请确保在将任何列转换为临时表之前对其进行转换,以使匹配过程更容易。

【讨论】:

无法测试它,但我喜欢这个想法。【参考方案5】:

我发现了问题所在。似乎是 DATETIME 字段导致了问题。

.. ue.last_login '%ayşenur%' 

给出Illegal mix of collations for operation 'like' 的错误。当我删除 LIKE partials DATETIME 字段时,不再有错误。我希望这会有所帮助。

【讨论】:

梅尔哈巴。您是否在不删除 DATETIME 的情况下解决了这个问题? 不,LIKE 和 DATETIME 不兼容是 MySQL 的问题。希望在以后的版本中修复。 据我了解,问题出在 JSON UNICODE DECODES 上。因此,在 PHP 5.4 中它应该可以工作。你试过最新的 PHP 版本了吗? @RiKo 你可能是对的。这个问题已经有一年了,所以我没有尝试使用最新版本。如果您尝试让它发挥作用,请告诉我和社区。谢谢 @RiKo 你试过最新版本了吗?【参考方案6】:

尝试以下方法:

u.id_user LIKE '%Ä°%' OR ... OR ... '%Ä°%' COLLATE utf8_bin

参考MySQL Unicode Character Sets

您也可以参考MySQL _bin and binary Collations了解更多关于utf8_bin的信息:

非二进制字符串(存储在 CHAR、VARCHAR 和 TEXT 数据中) types) 有一个字符集和排序规则。给定的字符集可以 有几个排序规则,每个排序规则定义一个特定的排序 和集合中字符的比较顺序。其中之一是 字符集的二进制排序规则,由 _bin 后缀表示 在排序规则名称中。例如 latin1 和 utf8 有二进制 命名为 latin1_bin 和 utf8_bin 的排序规则。

【讨论】:

感谢您的知识,但它没有用。我认为这与图书馆如何处理帖子数据有关。 你为什么不在你的控制器中尝试var_dump($this-&gt;input-&gt;post());,看看CI对这些字符做了什么。 我做到了。这就是问题所在。我被这个堆积了,为什么post不是utf-8? POST 好像是 UTF-8,没关系。 Ignited-Datatables 出了点问题_ 进一步参考 [链接] (github.com/IgnitedDatatables/Ignited-Datatables/issues/38)

以上是关于使用 Ignited-Datatables 搜索时非法混合排序规则以进行“like”操作的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 in 运算符搜索列表时使用啥算法?

在快速键入期间使用搜索栏进行搜索时 TableView 崩溃

使用 SearchController 搜索时使用标签栏出现黑屏

在弹性搜索中使用 GET/POST 时结果不同

使用 berkeley DB 进行数据搜索时出错

使用引号字符搜索时崩溃