# mysql 字符集相关问题 - MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation)。 - 对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。 - MySQL默认字符集 MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。但是,传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢? 1. 编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1; 2. 安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的; 3. 启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时character_set_server被设定为这个默认的字符集; 4. 当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server; 5. 当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集; 6. 在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集; 7. 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集; - 简单的总结一下 如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用latin1存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用UTF-8存储。 - 查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1) 通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令: SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation_%'; - 修改默认字符集 - 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值default-character-set = utf8,修改完后,重启mysql的服务: service mysql restart. - 还有一种修改字符集的方法,就是使用mysql的命令 SET character_set_client = utf8; - MySQL中涉及的几个字符集 | 字符集类型 | 字符集说明 | | -------- | -------- | | character-set-server/default-character-set | 服务器字符集,默认情况下所采用的 | | character-set-database | 数据库字符集 | | character-set-table | 数据库表字符集 | | character-set-client | 客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。 | | character-set-results | 结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。 | - 优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集。 - 在客户端,如果没有定义character-set-results,则采用character-set-client字符集作为默认的字符集。所以只需要设置character-set-client字符集。 - 要处理中文,则可以将character-set-server和character-set-client均设置为GB2312,如果要同时处理多国语言,则设置为UTF8。 - 关于MySQL的中文问题 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。 character_set_client:客户端的字符集。 character_set_results:结果字符集。 character_set_connection:连接字符集。 设置这三个系统参数通过向MySQL发送语句:set names gb2312/utf-8 - 关于GBK、GB2312、UTF8 - UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。 - GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。 - GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换: GBK、GB2312--Unicode--UTF8 UTF8--Unicode--GBK、GB2312 - 英文字符较多,则建议使用UTF-8节省空间;GB2312是GBK的子集,GBK是GB18030的子集;GBK是包括中日韩字符的大字符集合;UTF-8可以看作是大字符集,它包含了大部分文字的编码。 - 字符集支持说明 gb2312是简体中文的码 gbk支持简体中文及繁体中文 big5支持繁体中文 utf-8支持几乎所有字符 - 分析乱码的情况 - 写入数据库时作为乱码写入 - 查询结果以乱码返回 - 查看mysql字符集设置情况 show variables like '%char%'; ###### tags: `mysql`