最近几天的时间都在弄mysql字符问题,最让我头疼的是一开始mysql能支持中文插入,但是不支持中文表名。这让我都抓狂了,现已解决该问题,解决方案如下,希望碰到类似问题的同行能少走弯路。
首先我要感谢“http://zhidao.baidu.com/question/272450723.html 的 ' 易网库 ' " ;他的一句 “有,那是php的内置函数,取代mysql_query('set names utf8') !“结束了我的痛苦。
现将一整套的解决方案陈述如下:
1. mysql字符集基础知识:
MySQL 5.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。我们最终的目标是使得这四个层次转化会支持中文的编码,本例中统一使用 utf8 编码。
2.设置默认的utf8 编码格式
在终端输入 sudo gedit /etc/mysq/my.cnf 输入管理员密码后就能打开my.cnf文件,在my.cnf文件的[mysql]下面加上 default-character-set=utf8,然后在终端输入 sudo /etc/init.d/mysql restart 重启mysql。这样设置的默认编码就生效了。
3.创建数据库
在终端输入 mysql -u[username] -p[pwd] 后进入”mysql>“提示符,输入 create database [数据库名] default character set utf8 ;这样就建立了一个utf8编码的数据库了。
然后输入 user [数据库名] 进入该数据库。
4. 统一各层次的编码格式
在完成第3步之后,输入 show variables like 'char%' ;将会看到如下输出。在该输出中可以看到除character_set_server 为atin1(这个该不了,至少是用set character_set_server=utf8不能改) 编码之外其他都为utf8,当然filesystem也除外。这说明该数据库没问题了。
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
5.在第4步中建立的数据库中创建表:
CREATE TABLE whetherjoinclass(
name varchar(50) NOT NULL,
joinedclass varchar(50) NOT NULL,
whetherauthority varchar(10) NOT NULL,
PRIMARY KEY (name)
)DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建表的时候在末尾要加上DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ,如上所示。创建好表之后,使用show full columns from whetherjoinclass 来查看表中各属性的编码方式,当看到如下输出时表示编码正确。
+------------------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+------------------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| name | varchar(50) | utf8_general_ci | NO | PRI | NULL | | select,insert,update,references | |
| joinedclass | varchar(50) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
| whetherauthority | varchar(10) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
+------------------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
这样就算是把基本的设置搞定。
6.在PHP页面中使用
header("Content-type: text/html; charset=utf8");来设置php文件的编码,在php文件中使用mysql数据库的时候在跟数据库建立连接后使用 mysql_query('set names utf8') ;来设置连接的编码方式,这样就能做到中文的任意使用了。
至此,解决mysql中文乱码的问题就算搞定了,回过头想想,要想没有乱码只需保证前后一致,从头到尾都用同一种编码(前提是该编码方式支持中文)方式。