V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sdjl
V2EX  ›  程序员

请问要把 🎉 字符存在 MySQL 表里的话,如何申明字段定义?

  •  
  •   sdjl · 2018-12-07 19:21:42 +08:00 · 4328 次点击
    这是一个创建于 2179 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对,就是这个字符: 🎉

    我目前的字段申明是:

    content varchar(300) charset utf8mb4 collate utf8mb4_general_ci default '';

    但会报错:ERROR 1366 (HY000): Incorrect string

    google 搜了半天了,都是说用 utf8mb4 就好了,但实践通不过,在线等~
    30 条回复    2018-12-08 17:26:32 +08:00
    sdjl
        1
    sdjl  
    OP
       2018-12-07 19:22:28 +08:00
    回复必感谢!( 24 小时内)
    xiangyuecn
        2
    xiangyuecn  
       2018-12-07 19:26:25 +08:00   ❤️ 1
    来了收割一波,不知道 mysql 有没有 n 打头的类型,nvarchar
    baocaixiong
        3
    baocaixiong  
       2018-12-07 19:30:48 +08:00   ❤️ 1
    ```
    CREATE TABLE `test` (
    `id` bigint(20) unsigned NOT NULL auto_increment,
    content varchar(300) default '',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_general_ci;

    insert into test (content)values( "🎉");
    ```
    naic
        4
    naic  
       2018-12-07 19:30:53 +08:00   ❤️ 1
    ![微信图片_20181207192915.png]( https://i.loli.net/2018/12/07/5c0a59d8b966f.png)
    ![微信图片_20181207192933.png]( https://i.loli.net/2018/12/07/5c0a59d94587f.png)
    应该是可以的
    naic
        5
    naic  
       2018-12-07 19:32:10 +08:00   ❤️ 1
    回复要怎上图……

    ![微信图片_20181207193139.png]( https://i.loli.net/2018/12/07/5c0a5a21a68e9.png)
    baocaixiong
        6
    baocaixiong  
       2018-12-07 19:32:56 +08:00   ❤️ 1
    @naic 直接贴图片地址,前后留空
    naic
        7
    naic  
       2018-12-07 19:34:26 +08:00   ❤️ 1
    @baocaixiong 请不要在每一个回复中都包括外链,这看起来像是在 spamming
    尴尬
    sdjl
        8
    sdjl  
    OP
       2018-12-07 19:36:11 +08:00
    @baocaixiong 我把你的代码复制过去也不行呢。

    mysql> CREATE TABLE `test` (
    -> `id` bigint(20) unsigned NOT NULL auto_increment,
    -> content varchar(300) default '',
    -> PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 collate=utf8mb4_general_ci;
    Query OK, 0 rows affected (0.01 sec)

    mysql> insert into test (content)values( "🎉");
    ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x8E\x89' for column 'content' at row 1

    我的 MySQL 版本是:
    Server version: 5.7.24 MySQL Community Server (GPL)
    zeraba
        9
    zeraba  
       2018-12-07 19:38:29 +08:00 via Android   ❤️ 2
    你的客户端也需要用 mb4 字符集连接
    andylsr
        10
    andylsr  
       2018-12-07 19:39:52 +08:00 via Android   ❤️ 1
    建表用 utf8mb4_unicode,客户端选一样的字符集即刻
    hlwjia
        11
    hlwjia  
       2018-12-07 19:41:15 +08:00   ❤️ 1
    @zeraba +1 所有能改的地方都得改成 utf8mb4_general_ci
    sdjl
        12
    sdjl  
    OP
       2018-12-07 19:42:22 +08:00
    @zeraba
    @andylsr

    谢谢,确实可以了。原来如此,我好二~
    fashy
        13
    fashy  
       2018-12-07 19:42:57 +08:00   ❤️ 1
    show variables like '%character%';
    看下数据库设置,服务器端的是否都已经设置了?
    sdjl
        14
    sdjl  
    OP
       2018-12-07 19:44:51 +08:00
    @fashy 我链接时没有用 utf8mb4,现在可以了 :)
    zjp
        15
    zjp  
       2018-12-07 19:46:37 +08:00   ❤️ 1
    sdjl
        16
    sdjl  
    OP
       2018-12-07 19:47:48 +08:00
    @zjp 不是每一个字段都需要 utf8mb4,一劳永逸的话会不会占用更多的磁盘空间?
    zjp
        17
    zjp  
       2018-12-07 19:51:06 +08:00   ❤️ 1
    @sdjl UTF8 是变长编码,占用更多磁盘空间只是之前 mb3 存不了 4 字节字符。不过会影响 MySQL 对最大字符数的计算
    c00WKmdje2wZLrSI
        18
    c00WKmdje2wZLrSI  
       2018-12-07 20:18:09 +08:00   ❤️ 1
    ![微信图片_20181207193139.png]( https://i.loli.net/2018/12/07/5c0a5a21a68e9.png)
    88250
        19
    88250  
       2018-12-07 21:07:17 +08:00   ❤️ 1
    迁移历史数据可参考这里 https://hacpai.com/article/1521094110639
    mmdsun
        20
    mmdsun  
       2018-12-07 21:14:15 +08:00 via Android   ❤️ 1
    就是 MySQL UTF-8 的 bug。得用 utf8mb4
    Livid
        21
    Livid  
    MOD
       2018-12-07 21:14:57 +08:00   ❤️ 2
    GTim
        22
    GTim  
       2018-12-07 21:15:48 +08:00   ❤️ 1
    @88250 谢谢了
    fanmouji
        23
    fanmouji  
       2018-12-07 23:09:42 +08:00 via Android   ❤️ 1
    做过保存微信用户昵称,MySQL5.7+,如果是通过代码保存的话 utf-8 编码,数据库字段用 varchar
    edsgerlin
        24
    edsgerlin  
       2018-12-08 01:02:56 +08:00   ❤️ 2
    如果有幸用 MySQL 8.0+的话,推荐用`utf8mb4_0900_ai_ci`,这个能支持 Unicode 9.0 新增的字符。
    Techzero
        25
    Techzero  
       2018-12-08 01:43:35 +08:00 via Android   ❤️ 1
    关键词 utf8mb4
    winglight2016
        26
    winglight2016  
       2018-12-08 09:22:25 +08:00   ❤️ 1
    我就奇怪,表情这种设置服务端肯定没问题的,那就只剩客户端的问题了,lz 下次记得用排除法
    echisan
        27
    echisan  
       2018-12-08 09:30:21 +08:00 via iPhone   ❤️ 1
    学习了
    leonard916
        28
    leonard916  
       2018-12-08 12:20:40 +08:00   ❤️ 1
    試試 UTF16
    sdjl
        29
    sdjl  
    OP
       2018-12-08 12:33:30 +08:00
    @Livid 谢谢版主,我把备份的字符集也改了 :)
    DRcoding
        30
    DRcoding  
       2018-12-08 17:26:32 +08:00   ❤️ 1
    很久前遇到过,改字符集是简单省事,但是不至于为了存个 emoji 改字符集。。。前端转码,或者我看到 TX 某客户端的做法是整理搞了个 emoji 字符的对应关系,全部存成了对应或相近的图片。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3613 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:53 · PVG 12:53 · LAX 20:53 · JFK 23:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.