SQL 表情符号的正则表达式约束

SQL Regex Constraint for Emojis

我们希望将表情符号存储在数据库中 table。表情符号只是文本(Unicode 字形),因此需要某种验证来识别仅添加了表情符号 ('') 而不是输入了另一个文本字符 ('Random words')。

有人验证表情符号吗?

简介

注意事项up-front:

  1. 自 2015 年 v1 以来,官方表情符号集一直在不断发展。在本文发布时,latest official release is v14
  2. 作为 Unicode 标准的一部分,表情符号是字形。但是一个表情符号字形并不总是由一个 Unicode 字符创建。随着版本的发布,越来越多的表情符号是由 多个 Unicode 值的相邻创建的,以说明 skin-tone、性别、hair-type 和其他变体 .
  3. 建议短名称和短代码可以是library-specific,可能支持别名或替代名称。存储构成表情符号字形的 Unicode 字符简化了这个 architectural-fragility,尽管它随后将更多所有权放在 front-end 库上,以便将 skin-tone 变体组合在一起。
  4. The emoji set reuses some existing Unicode glyphs,喜欢黑色的“心形套装”(♥),添加变体选择器,让它们正式成为表情符号集的一部分(❤️)。这意味着一些 表情符号字符是 non-sequential,因为它们在表情符号存在之前就已添加到 Unicode 标准中。
  5. 许多系统都有自己的不属于官方标准的异常表情符号。这些不包括在这项工作中,但如果它们由多个 Unicode 值组成,它们仍可能通过建议的验证。

建议的解决方案

抓取 the codes of the current list, and adding the Zero Width Joiner 和所有组件字形后,我建议进行以下检查。

alter table emojis add constraint emojis__emoji_regex_ck check (value ~ '^[\U00000023,\U0000002A,\U00000030-\U00000039,\U000000A9,\U000000AE,\U0000200D,\U0000203C,\U00002049,\U00002122,\U00002139,\U00002194-\U00002199,\U000021A9-\U000021AA,\U0000231A-\U0000231B,\U00002328,\U000023CF,\U000023E9-\U000023F3,\U000023F8-\U000023FA,\U000024C2,\U000025AA-\U000025AB,\U000025B6,\U000025C0,\U000025FB-\U000025FE,\U00002600-\U00002604,\U0000260E,\U00002611,\U00002614-\U00002615,\U00002618,\U0000261D,\U00002620,\U00002622-\U00002623,\U00002626,\U0000262A,\U0000262E-\U0000262F,\U00002638-\U0000263A,\U00002640,\U00002642,\U00002648-\U00002653,\U0000265F-\U00002660,\U00002663,\U00002665-\U00002666,\U00002668,\U0000267B,\U0000267E-\U0000267F,\U00002692-\U00002697,\U00002699,\U0000269B-\U0000269C,\U000026A0-\U000026A1,\U000026A7,\U000026AA-\U000026AB,\U000026B0-\U000026B1,\U000026BD-\U000026BE,\U000026C4-\U000026C5,\U000026C8,\U000026CE-\U000026CF,\U000026D1,\U000026D3-\U000026D4,\U000026E9-\U000026EA,\U000026F0-\U000026F5,\U000026F7-\U000026FA,\U000026FD,\U00002702,\U00002705,\U00002708-\U0000270D,\U0000270F,\U00002712,\U00002714,\U00002716,\U0000271D,\U00002721,\U00002728,\U00002733-\U00002734,\U00002744,\U00002747,\U0000274C,\U0000274E,\U00002753-\U00002755,\U00002757,\U00002763-\U00002764,\U00002795-\U00002797,\U000027A1,\U000027B0,\U000027BF,\U00002934-\U00002935,\U00002B05-\U00002B07,\U00002B1B-\U00002B1C,\U00002B50,\U00002B55,\U00003030,\U0000303D,\U00003297,\U00003299, \U0000FE0F, \U0001F004,\U0001F0CF,\U0001F170-\U0001F171,\U0001F17E-\U0001F17F,\U0001F18E,\U0001F191-\U0001F19A,\U0001F1E6-\U0001F1FF,\U0001F201-\U0001F202,\U0001F21A,\U0001F22F,\U0001F232-\U0001F23A,\U0001F250-\U0001F251,\U0001F300-\U0001F321,\U0001F324-\U0001F393,\U0001F396-\U0001F397,\U0001F399-\U0001F39B,\U0001F39E-\U0001F3F0,\U0001F3F3-\U0001F3F5,\U0001F3F7-\U0001F4FD,\U0001F4FF-\U0001F53D,\U0001F549-\U0001F54E,\U0001F550-\U0001F567,\U0001F56F-\U0001F570,\U0001F573-\U0001F57A,\U0001F587,\U0001F58A-\U0001F58D,\U0001F590,\U0001F595-\U0001F596,\U0001F5A4-\U0001F5A5,\U0001F5A8,\U0001F5B1-\U0001F5B2,\U0001F5BC,\U0001F5C2-\U0001F5C4,\U0001F5D1-\U0001F5D3,\U0001F5DC-\U0001F5DE,\U0001F5E1,\U0001F5E3,\U0001F5E8,\U0001F5EF,\U0001F5F3,\U0001F5FA-\U0001F64F,\U0001F680-\U0001F6C5,\U0001F6CB-\U0001F6D2,\U0001F6D5-\U0001F6D7,\U0001F6DD-\U0001F6E5,\U0001F6E9,\U0001F6EB-\U0001F6EC,\U0001F6F0,\U0001F6F3-\U0001F6FC,\U0001F7E0-\U0001F7EB,\U0001F7F0,\U0001F90C-\U0001F93A,\U0001F93C-\U0001F945,\U0001F947-\U0001F9FF,\U0001FA70-\U0001FA74,\U0001FA78-\U0001FA7C,\U0001FA80-\U0001FA86,\U0001FA90-\U0001FAAC,\U0001FAB0-\U0001FABA,\U0001FAC0-\U0001FAC5,\U0001FAD0-\U0001FAD9,\U0001FAE0-\U0001FAE7,\U0001FAF0-\U0001FAF6]+$');

注意事项

不是bullet-proof。例如:

  • 这仅验证所有字符都来自表情符号集,而不是它们组合形成一个 valid/recognized 表情符号字形。
  • 这允许在同一字段中输入多个表情符号。 The largest combination of emoji glyphs that I found was 10,但即使是 10 个字符的 max-length 也无法阻止将 10 个 thumbs-up 表情符号输入同一字段。
  • 您可以通过缩小范围中的一些间隙来缩小此验证正则表达式。例如,legacy "white club suit" glyph (♧) 不是当前表情符号规范的一部分,但它周围的那些字形是。

一旦 v15 及更高版本发布,就必须更新此列表。但这应该是一个开始。 这就是全部 self-researched,所以如果我遗漏了什么、贴错了什么标签、夸大了什么,或者只是弄错了,请在下面评论。