javascript - Mitt SQL-uttryck jämför inte unicode-emojis korrekt?


fullEmoji är en egenskap som lagras i discord.js ParsedEmoji-objektet och som bara ska vara en bokstavlig emoji '😄'.

ParsedEmoji är bara ett gränssnitt men jag får det genom att kalla parseEmoji() som är privat, det är främst för Discords egna emojis eftersom om ParsedEmoji.id inte är giltig vet jag att det antingen är en unicode eller inte en emoji och då gör jag bara ett regex-test med emoji-regex för att se om det är en unicode-emoji

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}';
`)

När jag kör denna fråga raderas alla rader med emoji-länkar och jag antar att det beror på att AND emoji=''${fullEmoji}' inte fungerar korrekt.

Teckenuppsättningen jag använder är utf8mb4 och sorteringen utf8mb4_0900_ai_ci

Lista raderna nedan:


id, emoji, roll_id, meddelanden_reagerbara_id

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

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


VISA SKAPA TABELL:

Bord, Skapa bord

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

Så detta visar sorteringsordningen som utf8mb4_unicode_ci

Jag vet inte vad mer jag kan prova. Jag har försökt lite med forskning och kunde inte hitta mycket som är direkt relaterat till detta. Jag vet inte exakt vilket problem jag har här eftersom allt detta finns i själva frågan.

en sak jag skulle försöka om det inte finns något sätt att få detta att fungera är att fly från emoji:erna och avfly från dem igen senare men jag skulle behöva skriva om mycket kod så jag sparar det som en sista utväg

Svar #1

SHOW VARIABLES LIKE 'coll%'; för att se vilken anslutning testet kommer att utföras med. Observera att kolumnen använder utf8mb4_unicode_ci.

Observera att 'ai_ci' behandlar dessa emoji som olika, men den [ganska gamla] 'unicode'-sorteringen behandlar dem som lika.

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 hänvisar till Unicode-standard 4.0; 0900 hänvisar till 9.0.

Relaterade artiklar