php+mysql应用采用utf-8编码,但是页面显示数据库数据或者Mysql命令行导入的数据有乱码,这个问题分两大步骤
I. 更该服务器端存储编码(全部改为utf-8)
1.全局修改
找到[mysqld] 添加:
//默认字符集为utf8
default-character-set=utf8
重新启动数据库
这种方式意味着,如果此后创建的数据库都将是utf-8编码,相应的表和字段都默认utf-8编码。但是如果一个非UTF-8编码的数据库已经创建好了,那么如何使程序在UTF-8下工作呢?请看2的说明。
2. 已存在的非utf-8编码的数据库(有可能在虚拟主机上,不允许创建数据库),则可采用下面的方法:
1).修改数据库编码 : ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将test数据库的编码设为utf8
2).修改表的编码 : ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将一个表category的编码改为utf8
3).修改字段的编码 : ALTER TABLE `table_name` CHANGE `column_name` `column_name` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
II. 客户端连接时编码指定(指定为UTF-8)
1). 更改服务器端
1. 可以更改MySQL数据库默认编码,修改my.ini
找到[client] 添加:
default-character-set=utf8 //默认字符集为utf8
2). 如果数据库数据来自文本文件,通过命令行导入时,那么需要指定mysql命令参数 --default-character-set=utf8,该参数说明了导入程序以什么编码看待你的导入文本。
引用
mysql --default-character-set=utf8 -u allen -p123456 my_db<data.sql
3). 如果客户端是PHP,别忘记了在操作数据库前设置编码
db_query( 'SET NAMES UTF8' );
只有在Mysql客户端连接默认连接设置为utf-8时(即1)方法指定了default-character-set=utf8),2),3)两种连接是不必要的。
可以通过mysql --help 来检查你的客户端的默认连接设置
引用
.....
auto-rehash TRUE
character-sets-dir (No default value)
default-character-set utf8
compress FALSE
database (No default value)
.........
上面的例子说明该数据库默认客户端连接编码为utf-8.
III.下面我们举一个实际的例子.
比如,安装Mantis的时候,菜单提示等中文都显示正确(页面编码是utf-8),但是提交Bug时输入的中文却显示乱码。
于是检查数据库编码,发现数据库编码为表示latin1,然后执行上面的1)和2), 重新提交Bug信息,发现还是乱码,直到运行第3)步使所有字段为utf-8, 才得到正确的结果。
只是第3)步实在太冗长,不妨可以采用一个变通的做法:
1. 修改数据库编码为utf-8 或者以utf-8编码重建数据库(CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci;)或者
2. 如果选择修改数据库编码为utf-8,那么接下来删除所有存在的表。
3. 重新安装Mantis, 这时Mantis生成表结构的时候,表和字段都会默认采用database的编码
这样省却了繁琐的第3)步(一个字段一个字段地更改编码)
IV. 顺便介绍几个Mysql 命令
1. 更改表引擎
ALTER TABLE table_name ENGINE = INNODB;
2. 查看表类型(存储引擎):
SHOW TABLE STATUS FROM db_name;
3. 查看表的所有信息
SHOW CREATE TABLE et;