Django是否始终将单个Emoji识别为1个字符长度?
emoji存储字段max_length设置方案及长度判定规则
Python侧emoji长度判定规则
Python 3的字符串原生采用Unicode编码,计算len()时的计数逻辑为单个Unicode码点计为1个长度单位:
- 基础独立emoji(例如😀)仅由1个Unicode码点构成,
len()返回值为1 - 带修饰符的emoji(例如带肤色的👍🏿)、组合类emoji(例如家庭组合👨👩👧👦)由多个Unicode码点拼接构成,
len()返回值等于其包含的码点数量,目前已发布的最长组合emoji码点数量不超过20个
Postgres侧emoji长度判定规则
只要数据库采用默认的UTF8编码,Postgres的CharField对应的varchar(n)类型中,n的计数逻辑同样为单个Unicode码点计为1个字符,和Python的长度计数规则完全一致,不存在字节和字符的换算问题,也没有MySQL需要单独用utf8mb4编码的额外限制。
max_length推荐设置
- 如果业务仅允许用户选择单个基础emoji作为反应,设置
max_length=1即可完全满足需求 - 如果业务允许使用带修饰符、组合类的emoji,建议设置
max_length=32,足够覆盖目前所有合规emoji的长度,冗余量也足够应对后续Unicode版本新增的emoji - 如有自定义表情等特殊存储需求,可以放宽到
max_length=64,Postgres的varchar类型在合理长度范围内,更大的长度上限不会带来额外的存储或性能损耗
内容的提问来源于stack exchange,提问作者andrepz
相关产品推荐
相关产品推荐

