MySql(二)——字符集及比较规则一些重要的字符集ASCII一共包含128个字符,包括空格、标点符号、数字、大小写字母和一些不可见的字符人物。由于总共只有128个字符,所以可以用一个字节来编码。ISO8859-1共包含256个字符,它在ASCII字符集的基础上扩展了128个西欧常用字符(包括德文和法文字母),也可以使用1个字节进行编码。这个字符集还有一个别名latin1GB2312,包含6763个汉字和682个其他文字符号。同时,该字符集兼容ASCII字符集。如果字符在ASCII字符集中,则使用1字节编码,否则使用2字节编码。这种可能需要不同的字节来表示一个字符的编码方式称为:可变长编码方式GBK在包含字符的范围内扩展了GB2312字符集,编码方式兼容GB2312utf8以包含所有可以想象的字符在地球上,而且还在不断扩大。该字符集兼容ASCII字符集,采用变长编码方式。它需要使用1到4个字节来编码一个字符。Utf8只是Unicode字符集的一种编码方案。Unicode字符集可以使用utf8、utf16、utf32。编码方案,utf8用1到4个字节编码一个字符,utf16用2个或4个字节编码一个字符,utf32用4个字节编码一个字符。MySQL中支持的字符集和排序规则utf8和utf8mb4utf8mb3:阉割后的utf8字符集,只用1到3个字节来表示字符utf8mb4:正宗的utf8字符集,用1到4个字节来表示字符在MySQL中,utf8是utf8mb3查看SHOW(CHARACTERSET|CHARSET)[LIKEmatchingpattern]比较规则查看SHOWCOLLATION[LIKEmatchingpattern]后缀英文释义description_aiaccentinsensitive不区分accent_asaccentsensitiveaccentsensitive_cicaseinsensitivecaseinsensitive_cscasesensitivecasesensitive_binbinary比较字符集和比较二进制模式下的规则1.MySQL有4个级别的字符集和比较规则服务器级别数据库级别表级别列级别2。Serverlevel服务器级字符集:SHOWVARIABLESLIKE'character_set_server'服务器级比较规则:SHOWVARIABLESLIKE'collat??ion_server'写入配置文件:[server]character_set_server=utf8collat??ion_server=utf8_general_ci3.数据库级当前数据库字符集:SHOWVARIABLESLIKE'character_set_database'当前数据库的比较规则:SHOWVARIABLESLIKE'collat??ion_database'创建和修改数据库时数据库的字符集和比较规则CREATEDATABASE数据库名[[DEFAULT]CHARACTERSET字符集名][[DEFAULT]COLLATE比较规则名];ALTERDATABASE数据库名称[[DEFAULT]CHARACTERSET字符集名称][[DEFAULT]COLLATE比较规则名称];创建数据库时不指定字符集和比对规则,默认使用服务器级别的字符集和比对规则4。表级CREATETABLE表名(列信息)[[DEFAULT]CHARACTERSET字符集名称][COLLATE比较规则名]]ALTERTABLE表名[[DEFAULT]CHARACTERSET字符集名][COLLATE比较规则名]如果在建表和修改表的语句中没有指定字符集和比较规则,则数据库表所在位置将使用表的字符集和比较规则作为表的字符集和比较规则5.列级CREATETABLE表名(列名字符串类型[CHARACTERSET字符集名称][COLLATE比较规则名称],其他列...);ALTERTABLE表名MODIFY列名字符串类型[CHARACTERSET字符集名称][COLLATE比较规则名称];对于一个列,如果在创建和修改语句中没有指定字符集和比较规则,则使用该字符集和比较规则以该列所在表的字符集和比较规则作为字符集列6的比较规则。只修改字符集或者只修改比较规则只修改字符集,那么比较规则就变成修改后的字符集。默认比较规则仅为修改比较规则,字符集将成为修改后的比较规则对应的字符集7.各层级字符集和比较规则汇总使用表的字符集和比较规则。如果在创建或修改表时没有明确指定字符集和比较规则,则表默认使用数据库的字符集和比较规则。如果在创建或修改数据库和比较规则时没有明确指定字符集,则数据库默认使用服务器的字符集和客户端与服务器通信时的字符集。从发送请求到返回结果的过程,伴随着多次字符集转换,在这个过程中会用到。3系统变量系统变量说明character_set_client服务端解码请求使用的字符集character_set_connection服务端运行时使用的字符集character_set_results服务端返回数据给客户端使用的字符集服务端会对得到的结果集进行编码使用character_set_results并将其发送给客户端。character_set_connection只是服务器在处理请求时使用的字符集。它是什么并不重要,但必须注意字符集中包含的字符范围必须覆盖请求。以及结果集中的字符,否则会出现请求中的字符无法编码成character_set_connection字符集或结果集中不能编码的字符SETNAMES字符集名称等价于:SETcharacter_set_client=字符集名称;SETcharacter_set_connection=字符集名称;SETcharacter_set_results=字符集名称;如果要写入配置文件:[client]default-character-set=utf8
