zoukankan      html  css  js  c++  java
  • 字符集和比较规则

    字符集

    字符集指的是某个字符范围的编码规则

    • ASCII(128个):1个字节进行编码,包含空格,标点符号,数字,大小写字母,一些不可见字符

    • ISO 8859-1/latin1(256个):1个字节进行编码,ASCII基础上扩充了128个西欧常见字符

    • GB2312(6762个):因兼容ASCII字符集,所以在ASCII内的1个字节进行编码,反之2个字节;包含6763个汉字,682个拉丁字母,希腊字母,日本平假名/片假名,俄语西里尔字母

    • GBK:对GB2312进行扩充

    • Unicode

      • UTF8:收录所有字符,兼容ASCII,采用变长编码,编码一个字符需要1-4个字节。
      • UTF16:编码一个字符需要2-4个字节
      • UTF32:编码一个字符需要4个字节

    MySQL支持的字符集

    • utf8mb3:阉割过的utf8字符集,编码一个字符需要1-3个字节
    • utf8mb4:真正的utf8字符集,编码一个字符需要1-4个字节

    因为一个字符所用的最大字节长度会影响数据库的存储和性能,所有一般我们都使用的1-3个字节表示字符。但如果有存储emoji等使用4个字节来编码一个字符的情况,可使用utf8mb4

    可通过命令show charset;查看当前数据库支持的字符集,及其默认比较规则default_collection和最大长度max_len。

    MySQL中字符集和比较规则有四种级别:
    • 服务器级别:可在配置文件中更改

    查看字符集:SHOW VARIABLES LIKE 'character_set_server'; ​ 查看比较规则:SHOW VARIABLES LIKE 'collation_server';

    • 数据库级别:建库时不指定默认使用服务器级别配置,建后不可更改。

    查看字符集:SHOW VARIABLES LIKE 'character_set_database';

    查看比较规则:SHOW VARIABLES LIKE 'collation_database';

    • 表级别:建表时不指定默认使用数据库级别配置,建后不可更改。
    • 列级别:建列时不指定默认使用表级别配置,可通过alter修改。
    客户端与服务端请求通信

    从客户端请求到服务端查找结果再到结果集返回给客户端。这其中涉及到三个系统变量,影响客户端请求内容和服务器返回结果的字符集转换。如果这三个系统变量不一致,将影响请求结果与我们期望的不一致。过程如下:

    • 客户端发送请求,使用的字符集一般默认系统使用的字符集,如win->gbk,unix->utf8;
    • 服务端收到客户端发送来的请求,首先根据character_set_client进行解码,然后再用character_set_connection进行编码,如果查找列使用的字符集与character_set_connection一致则直接从列中找到对应值;如果列的字符集与之不同则需要再进行一次字符集转换
    • 将上部由character_set_connection编码的结果记录进行解码,再编码为character_set_results代表的字符集,客户端收到这个结果集后再转化为操作系统支持的字符串
    系统变量描述
    character_set_client 服务器解码请求时使用的字符集
    character_set_connection 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
    character_set_results 服务器向客户端返回数据时使用的字符集

    可通过SET NAMES 字符集名;同时更改这三个变量,等同于SET character_set_client = 字符集名;& SET character_set_connection = 字符集名;& SET character_set_results = 字符集名;

    或者希望在客户端启动时设置成一样的,可在配置文件中写为default-character-set=utf8

    比较规则的应用

    比较规则的作用体现在字符串大小的表达式,对某个字符串的排列(order by)

  • 相关阅读:
    Pytest 系列(28)- 参数化 parametrize + @allure.title() 动态生成标题
    Pytest 系列(27)- allure 命令行参数
    Pytest 系列(26)- 清空 allure 历史报告记录
    Pytest 系列(25)- 标记用例级别 @allure.
    Pytest 系列(24)- allure 环境准备
    基于Python的三种Bandit算法的实现
    博客迁移
    团体程序设计天梯赛2020游记
    P1825 [USACO11OPEN]Corn Maze S
    # JavaScript中的对象转数组Array.prototype.slice.call()方法详解
  • 原文地址:https://www.cnblogs.com/hangzhi/p/10947966.html
Copyright © 2011-2022 走看看