11

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

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

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

4

6 回答 6

18

我解决了这个问题。似乎是 DATETIME 字段导致了问题。

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

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

于 2013-09-06T06:10:57.880 回答
4

尝试以下操作:

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 的二进制排序规则。

于 2013-09-05T06:39:48.043 回答
3

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

于 2018-03-22T10:31:26.193 回答
2

我在 Datatable 搜索 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;
            }
        }
    }
于 2021-03-10T13:33:50.493 回答
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 列给出了操作“like”的非法混合排序规则的错误,因此,通过将其转换为另一个表实体,以前的列类型将被替换为 varchar 类型。

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

于 2016-08-17T04:15:55.277 回答
1

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

在官方MySQL 错误网站上找到了解决方案。

于 2019-02-14T09:11:11.887 回答