软件测试 | MySQL 字符集的设置
服务器字符集和校对规则
服务器字符集和校对,在 MySQL 服务启动的时候确定。
如果没有特别的指定服务器字符集,默认使用 latin1 作为服务器字符集。上面 3 种设置的方式都只指定了字符集,没有指定校对规则,这样是使用该字符集默认的校对规则,如果要使用该字符集的非默认校对规则,则需要在指定字符集的同时指定校对规则。
可以用“show variables like 'character_set_server';”命令查询当前服务器的字符集和校对规则。
数据库字符集和校对规则
数据库的字符集和校对规则在创建数据库的时候指定,也可以在创建完数据库后通过“alter database”命令进行修改。需要注意的是,如果数据库里已经存在数据,因为修改字符集并不能将已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容,在 9.7 小节中通过一个具体的例子介绍了字符集的修改方法。
设置数据库字符集的规则是:
如果指定了字符集和校对规则,则使用指定的字符集和校对规则;
如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则;
如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字
符集和校对规则。
推荐在创建数据库的时候明确指定字符集和校对规则,避免受到默认值的影响。 要 显 示 当 前 数 据 库 的 字 符 集 和 校 对 规 则 , 可 以 使 用 “ show variables like ' character_set_database '”和“show variables like ' collation_database '”命令查看:
表字符集和校对规则
表的字符集和校对规则在创建表的时候指定,可以通过 alter table 命令进行修改,同样,如
果表中已有记录,修改字符集对原有的记录并没有影响,不会按照新的字符集进行存放。表
的字段仍然使用原来的字符集。
设置表的字符集的规则和上面基本类似:
如果指定了字符集和校对规则,使用指定的字符集和校对规则;
如果指定了字符集没有指定校对规则,使用指定字符集的默认校对规则;
如果没有指定字符集和校对规则,使用数据库字符集和校对规则作为表的字符集和校对规则。
推荐在创建表的时候明确指定字符集和校对规则,避免受到默认值的影响。要显示表的字符
集和校对规则,可以使用 show create table 命令查看:
列字符集和校对规则
MySQL 可以定义列级别的字符集和校对规则,主要是针对相同的表不同字段需要使用不同的字符集的情况,应该说一般遇到这种情况的几率比较小,这只是 MySQL 提供给我们一个灵活设置的手段。
列字符集和校对规则的定义可以在创建表时指定,或者在修改表时调整,如果在创建表的时候没有特别指定字符集和校对规则,则默认使用表的字符集和校对规则。
连接字符集和校对规则
上面 4 种设置方式,确定的是数据保存的字符集和校对规则,对于实际的应用访问来说,还
存在客户端和服务器之间交互的字符集和校对规则的设置。
对于客户端和服务器的交互操作,MylSQL 提供了 3 个不同的参数:character_set_clientcharacter_set_connection 和 character_set_results,分别代表客户端、连接和返回结果的字符集,通常情况下,这 3 个字符集应该是相同的,才可以确保用户写入的数据可以正确地读出,特别是对于中文字符,不同的写入字符集和返回结果字符集将导致写入的记录不能正确读出。 通常情况下,不会单个地设置这 3 个参数,可以通过以下命令:
来设置连接的字符集和校对规则,这个命令可以同时修改这 3 个参数的值。使用这个方法修改连接的字符集和校对规则,需要应用每次连接数据库后都执行这个命令。另外一个更简便的办法,是在 my.cnf 中设置以下语句:
这样服务器启动后,所有连接默认就是使用 GBK 字符集进行连接的,而不需要在程序中再执行 set names 命令。
另外,字符串常量的字符集也是由 character_set_connection 参数来指定的。
可以通过“[_charset_name]'string' [COLLATE collation_name]”命令强制字符串的字符集和校对规则。例如:
通常情况下,基本不需要用户强制指定字符串字符集。
评论