zoukankan      html  css  js  c++  java
  • MySQL字符集

    MySQL之字符集

    字符集介绍

    • gbk/gb2312
      gbk/gb2312
      采用双字节字符集,不论中、英文字符均使用双字符来表示,为了区分中文,将其最高位都设定成1
      gb2312是gbk的子集,gbk是gb18030的子集,gb2312仅能存储简体中文字符
      gbk包括中日韩字符的大字符集
      通常使用gbk字符集足够
      国际通用性比utf8差,不过utf8占用的数据库比gbk大(utf8是三字节字符集)
    • utf8/utf8mb4
      UTF全称(Unicode Transformation Format),是Unicode的一种存储方式,可变长度字符编码,又称万国码
      数据库字符集尽量使用utf8(包括 connect、result、及最终html页面都必须要求一致为utf8)
      UTF8使用可变长度字节来存储 Unicode字符,例如 ASCII字母继续使用1个字节存储,重音文字、希腊字母、或西里尔字母等使用2个字节来存储,而常用的汉字就要用3个字节;也就是一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
      utf8mb4一个字符最多能存4字节,所以能支持更多的字符集;项目中常用utf8mb4存放emoji表情
      
      latin1
      是8bit (1 bytes)字符集,但不能覆盖亚洲、非洲语言
      unidoce是latin1的扩展,增加了亚洲、非洲常规语言支持,但仍不支持全部语言,且ASCII用unidoce来表示效率不高(小字符集转换成大字符集,往往便随的就是字符的丢失)
      utf8是unicode的扩展
      gbk、gb2312等字符集与utf8之间都必须通过Unicode编码才能相互转换

    字符集使用建议

    1、非常肯定只有中文终端用户时,可选择gbk / gb2312
    2、为了方便数据迁移、以及多种终端展示,最好是utf8
    3、字符无需区分大小写时,采用默认的xx_ci校验集可以,否则选择xx_bin校验集(生产环境中,尽量不要修改校验集)
    4、默认字符集是latin1,该字符集存放汉字是分开存放,以至于检索结果时不够精确,好处就是节省空间,不推荐使用

    MySQL字符集范围

    服务器层(server) > 数据库成(database) > 数据表(table) > 字段(column) > 连接(connection) | 结果集(result)

    MySQL字符集优先级

    连接(connection) | 结果集(result) > 字段(column) > 数据表(table) > 数据库成(database) > 服务器层(server)

    char类型

    char(N):N代表的是字符个数(也叫字符长度)、而非bytes
    char(N):是固定长存储,占用定长的存储空间,不足的部分用空格填充;MySQL处理char(N)类型时,需要将空格strip掉后return。
    存储空间:char(N)类型的存储空间和字符集有关系,结合刚才字符集的知识点,一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes、数字和字符统一用一个字符表示。
    存储机制:在不够N长度时,MySQL在存储数据时,需要用填充特殊的空格,而非十六进制的20
     
    思考:
    char(30),在不同的字符集中最多能存放多少个字母、汉字,以及占用空间情况
    gbk: 可以存放30个字节 占用的空间30*2
    utf8:可以存放30个字节 占用的空间30*3

    varcahr类型

    varchar(N):N代表的是字符个数(也叫字符长度)、而非bytes
    varchar(N):是变长存储,仅使用必要的存储空间.
    存储空间:varchar(N)类型的存储空间和字符集有关系,结合刚才字符集的知识点,一个中文在utf8字符集中占用3个bytes、gbk统一占用2个bytes、数字和字符一个字符表示。
    存储机制:varchar(N)字段存储实际是从第二个字节开始存储,然后用1到2个字节表示实际长度,剩下的才是可以存储数据的范围,因此最大可用存储范围是65535-3=65532字节;第一个字节标识是否为空.(长度小于255字节,使用一个字节来表示长度;大于255字节使用两个字节来表示长度)

    修改数据库实例字符集

    临时生效

    mysql> set character_set = 'gbk';
    mysql> set character_set_client = 'gbk';
    全局生效
    mysql> set global character_set_client = 'gbk';
    Query OK, 0 rows affected (0.00 sec)
    永久生效
    vim /etc/my.cnf 
    character-set-server=utf8
     
  • 相关阅读:
    乱码解决方案SecureCRT中文乱码解决方案
    普通用户注销windows server 2003 普通用户(users)远程登录立即自动注销的解决方法
    jquery同步基于jquery的$.ajax async使用
    服务解释WinSer 8 无法访问共享官方解释
    备用nulljs 输出内容到新窗口
    返回解释Java乔晓松Android SD卡路径问题以及如何获取SDCard内存大小
    复制最佳实践MySQL 磁盘复制技术DRBD:优缺点比较、注意事项以及最佳实践
    schema类SpringMVC+Hibernate+Spring整合(二)
    类class2013第十四周上机任务【项目2 抽象Shape类】
    数据库javaJAVA连接oracle数据库
  • 原文地址:https://www.cnblogs.com/yanjieli/p/9790047.html
Copyright © 2011-2022 走看看