我的 SQL 语句没有正确比较 unicode 表情符号?

问题描述 投票:0回答:1

fullEmoji 是存储在 discord.js ParsedEmoji 对象中的一个属性 这应该只是一个字面的表情符号'😄'。

ParsedEmoji 只是一个界面,但我通过调用得到它

parseEmoji()
这是私有的,它主要用于不和谐的自定义表情符号,因为如果 ParsedEmoji.id 无效,我知道它是 unicode 还是不是表情符号,然后我只是用 emoji-regex 进行正则表达式测试,看看它是否是unicode表情符号

const fullEmoji: string = parsedEmoji.id ? 
`<:${parsedEmoji.name}:${parsedEmoji.id}>` : parsedEmoji.name;

connPool.query<ResultSetHeader>(`
    DELETE FROM emoji_role_links WHERE messages_reactable_id = ${reactableMsg.id}
    AND emoji = '${fullEmoji}';
`)

当我运行这个查询时,它最终删除了所有表情符号链接行,我假设这是因为

AND emoji = '${fullEmoji}'
无法正常工作。

我使用的字符集是

utf8mb4
和整理
utf8mb4_0900_ai_ci

列出下面的行:


id, emoji, role_id, messages_reactable_id

'3', '😄', '1083419092192600086', '2'

'4', '🧉', '1099145715982278696', '2'


显示创建表:

表格,创建表格

CREATE TABLE emoji_role_links (
 id int unsigned NOT NULL AUTO_INCREMENT,
 emoji varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 role_id varchar(22) COLLATE utf8mb4_unicode_ci NOT NULL,
 messages_reactable_id int unsigned DEFAULT NULL,
 PRIMARY KEY (id),
 UNIQUE KEY role_id_UNIQUE (role_id),
 KEY fk_messages_reactable_id_idx (messages_reactable_id),
 CONSTRAINT fk_messages_reactable_id FOREIGN KEY (messages_reactable_id) REFERENCES messages_reactable (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

所以这表明整理是

utf8mb4_unicode_ci

我不知道还有什么可以尝试我已经尝试了一些研究但找不到与此直接相关的东西我不知道我在这里遇到的确切问题因为这都是查询本身

如果没有办法让它工作,我会尝试的一件事是转义表情符号并稍后再次转义它们,但我将不得不重写很多代码所以我将其保存为最后的手段

javascript mysql typescript mysql2 node-mysql
1个回答
0
投票

SHOW VARIABLES LIKE 'coll%';
以查看 connection 是否将执行测试。请注意,column 正在使用
utf8mb4_unicode_ci
.

请注意,'ai_ci' 将这些表情符号视为不同的,但 [vary old] 'unicode' 排序规则将它们视为相等的。

mysql> SELECT '😄' = '🧉' COLLATE utf8mb4_0900_ai_ci;
+--------------------------------------+
| '?' = '?' COLLATE utf8mb4_0900_ai_ci |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '😄' = '🧉' COLLATE utf8mb4_unicode_ci;
+--------------------------------------+
| '?' = '?' COLLATE utf8mb4_unicode_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)

unicode指的是Unicode标准4.0; 0900指的是9.0.

© www.soinside.com 2019 - 2024. All rights reserved.