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

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

  •  
  •   sdjl · 9 天前 · 2283 次点击
    对,就是这个字符: 🎉

    我目前的字段申明是:

    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
        1
    sdjl   9 天前
    回复必感谢!( 24 小时内)
        2
    xiangyuecn   9 天前   ♥ 1
    来了收割一波,不知道 mysql 有没有 n 打头的类型,nvarchar
        3
    baocaixiong   9 天前   ♥ 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( "🎉");
    ```
        4
    naic   9 天前   ♥ 1
    ![微信图片_20181207192915.png]( https://i.loli.net/2018/12/07/5c0a59d8b966f.png)
    ![微信图片_20181207192933.png]( https://i.loli.net/2018/12/07/5c0a59d94587f.png)
    应该是可以的
        5
    naic   9 天前   ♥ 1
    回复要怎上图……

    ![微信图片_20181207193139.png]( https://i.loli.net/2018/12/07/5c0a5a21a68e9.png)
        6
    baocaixiong   9 天前   ♥ 1
    @naic 直接贴图片地址,前后留空
        7
    naic   9 天前   ♥ 1
    @baocaixiong 请不要在每一个回复中都包括外链,这看起来像是在 spamming
    尴尬
        8
    sdjl   9 天前
    @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)
        9
    zeraba   9 天前 via Android   ♥ 2
    你的客户端也需要用 mb4 字符集连接
        10
    andylsr   9 天前 via Android   ♥ 1
    建表用 utf8mb4_unicode,客户端选一样的字符集即刻
        11
    hlwjia   9 天前   ♥ 1
    @zeraba +1 所有能改的地方都得改成 utf8mb4_general_ci
        12
    sdjl   9 天前
    @zeraba
    @andylsr

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