zoukankan      html  css  js  c++  java
  • 谨慎使用mysql的utf8

    一、mysql的utf8并不是你理解的utf8

        日常开发中,我们最常用的编码格式就是utf8,统一编码方式可以避免乱码的出现。各种文件、存储引擎(最终落到磁盘文件)都有自己的编码格式,但是有一个数据库的编码格式比较特殊,那就是mysql。通常utf8编码是一个字符占用四个字节,而mysql一个字符最多三个字节,换句话说,mysql的utf8编码格式和我们想象的不一样。平时的一些使用不会出现问题,但是对于一些占用字节比较多的符号,比如emoji,mysql就会出现问题。

    二、为什么mysql的utf8和其他的不一样

        这个有兴趣的同学可以了解一下历史。mysql在4.1的时候就开始使用utf8,那时候认为已经完全满足各种存储需求,后来发现不行才又补充了utf8mb4,utf8mb4和我们正常的utf8是一样的,所以对于一些特殊字符的存储,建议将编码改成utf8mb4

    三、只改字段就OK了吗

    创建完一个表之后,表的默认编码格式是utf8,而字段的编码格式是utf8mb4,这样肯定会有问题的,所以在建表的时候还需要指定表的编码格式

    折腾一趟之后,信心满满的去试了下,发现还是不行,估计心里已经路过一万只羊驼了,因为还需要修改数据库级别的编码格式

    数据库是utf8的,你没法修改,DBA也不会给你改,那就换条路走吧

    四、不修改mysql配置,如何解决

    有些数据库表可能已经存在很久,并且使用的都是utf8;或者不想修改mysql的配置,这个时候要怎么处理呢?

    其实只要对要存储的数据进行一下编码,取出的时候再解码一次就好了,这里推荐一个小工具emoji-java,git地址: https://github.com/vdurmont/emoji-java/

    maven依赖:

    <dependency>
      <groupId>com.vdurmont</groupId>
      <artifactId>emoji-java</artifactId>
      <version>4.0.0</version>
    </dependency>

    具体示例代码:

    /**
    * 将emoji字符串转换为数据库中可存储的字符串
    * @param emojiStr
    * @return
    */
    public static String emojiToStr(String emojiStr){
        return EmojiParser.parseToAliases(emojiStr);
    }

    /**
    * 将数据库中的字符串转换为emoji字符串
    * @param str
    * @return
    */
    public static String strToEmoji(String str){
        return EmojiParser.parseToUnicode(str);
    }

  • 相关阅读:
    第30周日
    第30周六
    第30周五
    第30周四
    第30周三
    第30周二
    第30周一
    第29周日
    软件架构学习小结
    数据挖掘十大经典算法
  • 原文地址:https://www.cnblogs.com/1ning/p/11098744.html
Copyright © 2011-2022 走看看