首页 > 解决方案 > PHPmyadmin 中的 SQL 查询无法区分表情符号

问题描述

我已经用谷歌搜索了,到目前为止没有发现任何问题,因为这似乎与字符集有关,这在我的情况下似乎是正确的。

情况:
我想计算名字中带有不同表情符号的人,但似乎查询无法区分表情符号。

询问:

SELECT Sum(CASE WHEN u.nick LIKE '%%'
           THEN 1
           ELSE 0
           END) AS 'NF'
    ,Sum(CASE WHEN u.nick LIKE '%%'
           THEN 1
           ELSE 0
           END) AS 'T'
FROM users u

--> 

|NF |T  |               |NF|T |
---------   Should be:  -------
|128|128|               |76|52|

以下查询将生成一个列表,其中列出了姓名中包含 unicode-sign 的任何人,而不仅仅是带有 -Emoji 的人。这支持了我的论点,即查询不想区分任何 unicode 符号。

SELECT *
FROM users u
WHERE u.nick LIKE '%%'

附加信息:
服务器:Localhost via UNIX socket
服务器类型:MariaDB
服务器版本:10.1.48-MariaDB-0ubuntu0.18.04.1 - Ubuntu 18.04
Protokoll-版本:10
服务器-Zeichensatz:UTF-8 Unicode (utf8mb4)
Datenbank-客户端版本:libmysql - mysqlnd 7.4.22
PHP-Erweiterung:mysqli 文档 curl 文档 mbstring 文档
PHP-版本:7.4.22
表“用户”排序:utf8mb4_unicode_ci
行 nick-Typ:varchar(255)
行 nick-Kollat​​ion:utf8mb4_general_ci

有人知道问题出在哪里吗?

标签: sqlunicodemariadb

解决方案


这可能是由Sushi-Beer 问题引起的,该问题将所有表情符号视为平等。如果要唯一标识每个字符,可以使用utf8mb4_bin排序规则:

MariaDB [(none)]> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SELECT '' = '';
+-----------+
| '?' = '?' |
+-----------+
|         1 |
+-----------+
1 row in set (0.000 sec)

MariaDB [(none)]> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SELECT '' = '';
+-----------+
| '?' = '?' |
+-----------+
|         0 |
+-----------+
1 row in set (0.000 sec)

推荐阅读