阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL字符集

428次阅读
没有评论

共计 1871 个字符,预计需要花费 5 分钟才能阅读完成。

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

 

 

 

 

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-28发表,共计1871字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中