一:mysql字符集
mysql的字符集支持(Character Set Support)有两个类型:字符集(Character set)和连接校对(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。mysql对于字符集的指定可以细化到一个数据库,一张表,一列。一般的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置
(1)编译mysql时,默认的字符集是 latin1;
(2)安装mysql时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定这个值采用默认的;
(3)启动mysql时,可以在命令行参数中指定默认的的字符集,如果没指定则继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储。
(2)安装mysql时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定这个值采用默认的;
(3)启动mysql时,可以在命令行参数中指定默认的的字符集,如果没指定则继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储。
所以mysql的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8。
二:mysql乱码原因:
由以上可知:
1.server本身设置,例如编码还在使用latin1
2.数据表和字段的编码设定问题(包含character与collation)
3.客户端程式(例如php)的连线语系设定问题
注意:GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK。
三:编码查询
查看数据库的编码方式命令为:
四:编码方式的修改
1 mysql>show variables like 'character%'; 2 +--------------------------+----------------------------+ 3 | Variable_name | Value | 4 +--------------------------+----------------------------+ 5 | character_set_client | latin1 | 6 | character_set_connection | latin1 | 7 | character_set_database | latin1 | 8 | character_set_filesystem | binary | 9 | character_set_results | latin1 | 10 | character_set_server | latin1 | 11 | character_set_system | utf8 | 12 | character_sets_dir | /usr/share/mysql/charsets/ | 13 +--------------------------+----------------------------+、 15 mysql> show variables like 'collation%';(或者使用 >show variables like 'collation%';) 16 +----------------------+-------------------+ 17 | Variable_name | Value | 18 +----------------------+-----------------------+ 19 | collation_connection | latin1_swedish_ci | 20 | collation_database | latin1_swedish_ci | 21 | collation_server | latin1_swedish_ci | 22 +----------------------+-----------------------+
其中: character_set_client 为客户端编码方式;
修改后可以解决大部分的编码问题。 character_set_connection 为建立连接使用的编码;
character_set_database 数据库的编码;
character_set_results 结果集的编码;
character_set_database 数据库的编码;
character_set_results 结果集的编码;
character_set_server 数据库服务器的编码;
外部访问数据乱码的问题就出在这个connection连接层上,解决方法是在发送查询前执行一下下面这句:
SET names utf8 相当于: SET character_set_client ='utf8';
SET character_set_connection ='utf8';
SET character_set_connection ='utf8';
SET character_set_results ='utf8';
还有一种最简单的修改方法,就是修改mysql的my.ini(linux系统为my.cnf)文件中的字符集键值,
在[client]下面加上
default-character-set = utf8
在[mysqld]下面加上
character_set_server = utf8
default-character-set = utf8
character-set-server = utf8
collation-server = latin1_swedish_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
修改完后,重启mysql的服务,service mysql restart
五:避免创建数据库及表出现中文乱码和查看编码方法
1、创建数据库的时候:
1 CREATE DATABASE `datatest` 2 CHARACTER SET 'utf8' 3 COLLATE 'utf8_general_ci';
1 CREATE TABLE `database_user` ( 2 `id` varchar(40) NOT NULL default '', 3 `name` varchar(40) NOT NULL default '', 4 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果是已经建立的数据库可以使用以下修改
1.修改数据库的编码 将数据库(test)的编码方式修改为utf8,如:
1 ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
2.修改表的编码 将表(test)的编码方式修改为utf8,如:
1 ALTER TABLE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
3.修改字段的编码 将表(test)中字段(name)的编码方式修改为utf8,如:
1 ALTER TABLE `test` CHANGE `name` `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;