使用Ignited-Datatables搜索时,操作'like'的非法混合排序

时间:2013-09-05 06:22:14

标签: mysql codeigniter activerecord datatable

我已成功实施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 '%Ä°%' ) ...

%Ä°%部分会根据您输入的非拉丁字符进行更改。

有什么想法解决这个问题吗?

6 个答案:

答案 0 :(得分:17)

我弄明白了这个问题。似乎DATETIME字段会导致问题。

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

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

答案 1 :(得分:4)

尝试以下方法:

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的归类。

答案 2 :(得分:3)

这个问题有点老了。 最后我找到了一个解决方案改变" LIKE" TO" LIKE二进制"

答案 3 :(得分:1)

我知道这已经太晚了,但是,这是我的解决方法。

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列为操作的非法混合操作提供了错误,例如'因此,通过转换它,作为另一个表实体,以前的列类型将替换为varchar类型。

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

答案 4 :(得分: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;
            }
        }
    }

答案 5 :(得分:0)

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

该解决方案已在官方MySQL bugs website上找到。