基本概念
,字符(字符)是指人类语言中最小的表义符号,例如' 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)符号,
,字符(字符)是指人类语言中最小的表义符号,例如' 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)符号,