MySQL字符集基本概念和详细设置

  基本概念
  
  ,字符(字符)是指人类语言中最小的表义符号,例如' A ', ' B '等;
  ,给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(编码),例如,我们给字符' A '赋予数值0,给字符“B”赋予数值1,则0就是字符' A '的编码;
  ,给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(字符集)。例如,给定字符列表为{“A”、“B”}时,{A=祝辞0,' B '=祝辞1}就是一个字符集;
  ,字符序(排序)是指在同一字符集内字符之间的比较规则。
  ,确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
  ,每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(默认排序);
  ,MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感),_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾,例如:在字符序“utf8_general_ci”下,
  字符“a”和“a”是等价的;
  
  
  MySQL字符集设置
  
  ,系统变量:
  - character_set_server:默认的内部操作字符集
  - character_set_client:客户端来源数据使用的字符集
  - character_set_connection:连接层字符集
  - character_set_results:查询结果字符集
  - character_set_database:当前选中数据库的默认字符集
  - character_set_system:系统元数据(字段名等)字符集
  ——还有以collation_开头的同上面对应的变量,用来描述字符序。
  
  
  用介绍人指定文本字符串的字符集:
  ——格式为:[_charset]“字符串”(整理排序)
  (例如:
  ,,,,选择_latin1“字符串”;
  ,,,”,选择_utf8你好”核对utf8_general_ci;
  ——由介绍人修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。
  
  
  MySQL中的字符集转换过程
  
  
  1. MySQL服务器收到请求时将请求数据从character_set_client转换为character_set_connection;
  2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
  ,,,,——使用每个数据字段的字符集设定值;
  ,,,,——若上述值不存在,则使用对应数据表的默认字符集设定值(MySQL扩展,非SQL标准);
  ,,,,——若上述值不存在,则使用对应数据库的默认字符集设定值;
  ,,,,——若上述值不存在,则使用character_set_server设定值。
  
  
  3.将操作结果从内部操作字符集转换为character_set_results。
  
  
  ,我们现在回过头来分析下我们产生的乱码问题:
  ,,,,,一个我们的字段没有设置字符集,因此使用表的数据集
  ,,,,,b我们的表没有指定字符集,默认使用数据库存的字符集
  ,,,,,c我们的数据库在创建的时候没有指定字符集,因此使用character_set_server设定值
  ,,,,,d我们没有特意去修改character_set_server的指定字符集,因此使用mysql默认
  ,,,,,e mysql默认的字符集是latin1,中的一个因此,我们使用了latin1字中的一个符集,而我们character_set_connection的字符集是utf - 8,插入中文乱码也再所难免了。
  
  
  常见问题解析
  ,FAQ-1向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8
  ,,,——插入时根据MySQL服务器的默认设置,character_set_client, character_set_connection和character_set_results均为latin1;中的一个
  ,,,——插入操作的数据将经过latin1=中的一个祝辞latin1=祝辞中的一个use utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;
  ,,,-查询时的结果将经过utf8=祝辞use utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码。参考下图:,
  ,向默认字符集为latin1的中的一个数据表插入utf8编码的数据前设置了连接字符集为utf8(我们遇到的错误就是属于这一种)
  ,,,——插入时根据连接字符集设置,character_set_client, character_set_connection和character_set_results均为utf8;
  ,,,——插入数据将经过utf8=祝辞use utf8=祝辞latin1的中的一个字符集转换,若原始数据中含有\ u0000 ~ \ u00ff范围以外的Unicode字符,会因为无法在latin1字中的一个符集中表示而被转换为“?”(0×3 f)符号,

MySQL字符集基本概念和详细设置