V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
HDMItoDP
V2EX  ›  MySQL

mysql 数据库字符集选择,是用 utf8 还是 utf8mb4?

  •  1
     
  •   HDMItoDP · 2021-04-27 08:25:28 +08:00 · 5482 次点击
    这是一个创建于 1066 天前的主题,其中的信息可能已经有所发展或是发生改变。

    哪个用的多一些?

    27 条回复    2022-01-06 11:47:57 +08:00
    loveyu
        1
    loveyu  
       2021-04-27 08:29:58 +08:00 via Android
    utf8mb4
    wowo243
        2
    wowo243  
       2021-04-27 08:33:59 +08:00   ❤️ 3
    utf8mb4 能避免 emoji 存储问题
    Seanfuck
        3
    Seanfuck  
       2021-04-27 08:34:23 +08:00 via iPhone
    看场景,有特殊字符就必须后者
    HDMItoDP
        4
    HDMItoDP  
    OP
       2021-04-27 08:36:30 +08:00
    @Seanfuck 我能想到的特殊字符只有 emoji,还会有别的特殊字符吗
    wlzcool
        5
    wlzcool  
       2021-04-27 08:36:45 +08:00   ❤️ 3
    反正整个库必须要保持一致,不然连表查索引会走不上
    IvanLi127
        6
    IvanLi127  
       2021-04-27 08:40:39 +08:00 via Android
    请无脑选 utf8mb4
    eason1874
        7
    eason1874  
       2021-04-27 08:59:29 +08:00
    需要支持中文就无脑 utf8mb4,很多旧系统不支持生僻字就是因为不支持 4 字节,升级起来麻烦
    id4alex
        8
    id4alex  
       2021-04-27 09:01:03 +08:00
    新系统就上 utf8mb4 呗
    echo1937
        9
    echo1937  
       2021-04-27 09:01:41 +08:00   ❤️ 1
    新库无脑选择 utf8mb4,老库不爱改也可以不改。
    caola
        10
    caola  
       2021-04-27 09:02:13 +08:00
    MySQL 的 utf8mb4 才是真正意义上的 UTF-8
    qwerthhusn
        11
    qwerthhusn  
       2021-04-27 09:21:31 +08:00
    请问是使用 utf8mb4_bin 还是用 utf8mb4_general_ci?
    imnpc
        12
    imnpc  
       2021-04-27 09:28:35 +08:00
    目前 MySQL 8 默认就是 utf8mb4 , 一般为了兼容都是 utf8mb4
    HDMItoDP
        13
    HDMItoDP  
    OP
       2021-04-27 09:40:22 +08:00
    @imnpc MySQL 8 我看新建库的时候也是可以选 utf-8 的
    lonelymarried
        14
    lonelymarried  
       2021-04-27 09:59:41 +08:00
    用 jpa 存了一次 emoji,才知道要用 utf8mb4,记忆深刻。
    securityCoding
        15
    securityCoding  
       2021-04-27 10:30:10 +08:00
    utf8mb4 凡是表里面字段依赖用户输入无脑用这个
    xsm1890
        16
    xsm1890  
       2021-04-27 10:41:59 +08:00   ❤️ 1
    无论用哪种一定要统一。公司之前用的 utf8,后面用 utf8mb4 。虽说 utf8mb4 是 utf8 的超集,但是在索引关联上留下了大坑。
    rambo92
        17
    rambo92  
       2021-04-27 10:44:51 +08:00
    @wlzcool
    @xsm1890
    是的。
    不过除了 charset 要保持一致外,college 也要保持一致。
    hjq632233317
        18
    hjq632233317  
       2021-04-27 10:44:53 +08:00   ❤️ 1
    百度复制来的

    MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes
    4 的意思,专门用来兼容四字节的 unicode 。好在 utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4 外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了。
    二、内容描述
    那上面说了既然 utf8 能够存下大部分中文汉字,那为什么还要使用 utf8mb4 呢? 原来 mysql 支持的 utf8
    编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是
    0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode 字符,都无法使用
    Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android
    手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。
    三、问题根源
    最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码 21 位,正好能够表示所有的 17 个 Unicode 平面。
    utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。
    Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8 字符呢?我想了一下,可能是因为 Mysql
    刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535
    个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用
    utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如
    CHAR(100) Mysql 会保留 300 字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8
    字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。
    要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3
    版本以后的才支持(查看版本:select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.
    对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR 。
    JRay
        19
    JRay  
       2021-04-27 10:45:38 +08:00
    utf8mb4 emoji 难受
    liuxu
        20
    liuxu  
       2021-04-27 11:05:21 +08:00
    @qwerthhusn utf8mb4_unicode_ci
    huacx
        21
    huacx  
       2021-04-27 12:31:47 +08:00
    无脑上 utf8mb4, 不然会后悔
    zhou00
        22
    zhou00  
       2021-04-27 12:49:57 +08:00
    Mysql8.0 官方文档里说了,utf8 是 utf8mb3 的别名,utf8mb3 已经被弃用了,请选择 utf8mb4 代替 https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
    jedz
        23
    jedz  
       2021-04-27 18:36:58 +08:00
    utf8mb4 。因为 MySQL 的 utf8 不是 UTF-8,utf8mb4 才是。
    young1lin
        24
    young1lin  
       2021-04-27 18:46:32 +08:00
    如果你后面可能数据库会换的,建议 utf-8,如果稳定不换的,用 utf8mb4 。
    RangerWolf
        25
    RangerWolf  
       2021-04-27 23:55:33 +08:00   ❤️ 1
    @HDMItoDP MySQL 8 默认已经是 mb4

    @qwerthhusn 如果只是中英文 utf8mb4_general_ci 跟 utf8mb4_unicode_ci 差别不大,ci 是 case insensitive, 即大小写不敏感。utf8mb4_bin 是二进制存储,大小写敏感
    bxb100
        26
    bxb100  
       2021-04-28 10:07:27 +08:00
    一般 utf8 有 emoji 的列转 utf8mb4
    hfli1008
        27
    hfli1008  
       2022-01-06 11:47:57 +08:00 via Android
    @xsm1890 大佬,索引关联有什么坑?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:57 · PVG 22:57 · LAX 07:57 · JFK 10:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.