标题:Mysql数据库UTF-8编码问题汇总 出处:沧海一粟 时间:Thu, 17 Apr 2008 10:26:22 +0000 作者:jed 地址:http://www.dzhope.com/post/397/ 内容: 建表时先加上default charset=utf8; 插入中文数据之前(Mysql命令提示符下)是用set names gb2312; 在php页面中设置是mysql_query('SET NAMES UTF8'); 在php页面(已设定为utf8后)中插入中文数据不会出现乱码,应该插入数据库的时候就是以utf8字符集插入中文数据的故不会出现问题! 在php页面前面不要忘了加上header('content-type;text/html;charset=utf-8'); 大家在MySQL命令提示符下想查看数据,中文数据有可能是如下 '?????' 所以大家想查看到正确的中文要与插入中文数据一样使用set names gb2312; 例子: CREATE DATABASE mydb; USE mydb5; CREATE TABLE news ( news_id int not null auto_increment, news_title varchar(100) not null, news_contents text not null, news_date datetime not null, primary key(news_id) )default charset=utf8; set names gb2312; /*关键!插入中文数据要加上*/ INSERT INTO news VALUES(null, '新闻1', '111111', now()); INSERT INTO news VALUES(null, '新闻2', '222222', now()); INSERT INTO news VALUES(null, '新闻3', '333333', now()); INSERT INTO news VALUES(null, '新闻4', '444444', now()); INSERT INTO news VALUES(null, '新闻5', '555555', now()); Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\YSDH.YSDH-0>cd \ C:\>mysql -h localhost -uroot -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 to server version: 5.0.22-community-nt-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use mydb; Database changed mysql> INSERT INTO vote VALUES(null,'你是从哪里了解到本站的?',1,default); Query OK, 1 row affected (0.00 sec) mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO vote VALUES(null,'你是从哪里了解到本站的?',1,default); ERROR 1406 (22001): Data too long for column 'vote_title' at row 1 (varchar(100) 还不够?) mysql> describe vote; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | vote_id | int(11) | NO | PRI | NULL | auto_increment | | vote_title | varchar(100) | NO | | NULL | | | vc_id | int(11) | NO | | NULL | | | votes_sum | int(11) | NO | | 0 | | +------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) mysql> 代码一: Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\YSDH.YSDH-0>cd \ C:\>mysql -h localhost -uroot -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 458 to server version: 5.0.22-community-nt-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use mydb; Database changed mysql> show tables; Empty set (0.00 sec) mysql> set names utf8; //设置数据库字符集为utf8 Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE vote -> ( -> vote_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> vote_title varchar(100) not null, -> vc_id int not null, -> votes_sum int not null default 0 -> )ENGINE=MyISAM DEFAULT CHARSET=utf8//创建数据表,字符集设定为utf8 -> ; Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO vote VALUES(null,'你是从哪里了解到本站的?',1,default); ERROR 1406 (22001): Data too long for column 'vote_title' at row 1//TNND,一样的字符插入中文也有错?疑问中..... mysql> INSERT INTO vote VALUES(null,'bu shi ba da ge',1,default);//插入英文无错.... Query OK, 1 row affected (0.00 sec) mysql> 代码二: mysql> drop table vote; Query OK, 0 rows affected (0.00 sec) mysql> set names gb2312;//设置数据库字符集为gb2312 Query OK, 0 rows affected (0.00 sec) mysql> CREATE TABLE vote -> ( -> vote_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> vote_title varchar(100) not null, -> vc_id int not null, -> votes_sum int not null default 0 -> )ENGINE=MyISAM DEFAULT CHARSET=gb2312 -> ; Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO vote VALUES(null,'你是从哪里了解到本站的?',1,default); Query OK, 1 row affected (0.00 sec)//gb2312不亏是专门为中文制定的标准啊..我喜欢不过不国际化 mysql> select * from vote; +---------+-------------------------+-------+-----------+ | vote_id | vote_title | vc_id | votes_sum | +---------+-------------------------+-------+-----------+ | 1 | 你是从哪里了解到本站的? | 1 | 0 | +---------+-------------------------+-------+-----------+ 1 row in set (0.00 sec) mysql> set names utf8;//设定字符集编码为utf8 Query OK, 0 rows affected (0.00 sec) mysql> select * from vote;//效果出来了^_^! +---------+------------------------------------+-------+-----------+ | vote_id | vote_title | vc_id | votes_sum | +---------+------------------------------------+-------+-----------+ | 1 | 浣犳槸浠庡摢閲屼簡瑙e埌鏈 珯鐨? | 1 | 0 | +---------+------------------------------------+-------+-----------+ 1 row in set (0.00 sec) 解决方案: 以前在internet上看到一篇文章说的是mysql编码问题! utf与gb2312等,问macleo那老小子这两种编程有什么不同,是不是utf8更加的国际化, 回答是:'聪明'; 后来我就去internet 上找了一篇文章,我也转载到我的baidu空间中了,相信经常来的朋友一定看过就篇文章! http://hi.baidu.com/zhaofei299/blog/item/e290ff99b9b889096f068c0b.html 最近在我看了php编程标准:http://www.phpe.net/html/php_coding_standard_cn.html(好东西) 后我决定要修改以后的不好的地方,追求标准国际化,于是从最近开始我就使用utf8来编写我的程序,以前我是用默认的gb2312的,看了utf8后有点不爽,经过几天下来,一个字爽,代码让人一看就有点像高手(虽然我很菜^_^) 前几天没用到数据库也没在意,以前看过那篇set names XXX,认为在连接数据库的时候加个 mysql_query('SET NAMES xxx')不就行了,就昨天我按我设想开始了对数据库的操作,谁知道可怕的事情发生了,显示乱码就真让人不爽,想到PHPer 第4期中有对编码的介绍http://hi.baidu.com/zhaofei299/blog/item/daa734f0bef131ada50f52cd.html 于是header('conten-type:text/html;charset=utf-8');当时我嘴上一笑应该搞定了吧,运行后没想到还是乱码,我当时行不爽,在网上搜了半天,想到哦,有可能是建表的时候没有使用utf编码插入,显示的时候用utf8就出问题了,使用drop table XXX后,set names utf8 然后建表, 使用mysql> INSERT INTO vote VALUES(null,'你是从哪里了解到本站的?',1,default); 插入数据时出错:ERROR 1406 (22001): Data too long for column 'vote_title' at row 1 不是吧,varchar(100)还长?? 使用mysql> INSERT INTO vote VALUES(null,'11111111111sdgsdg1111?',1,default); 成功了,我当时打击不小! 方案也就是说set names xxx一定要在插入中文数据后使用,否则报错.(建表后要加default charset utf8) 对了,在php中对数据库进行操作的时候一定用上set names utf8哦,要不然会出错的 最好在每个php页面之前加上header('conten-type:text/html;charset=utf-8') 使用utf8字符集注意事项: 建立新数据库时CREATE TABLE xxx DEFAULT CHARSET=UTF8;//这样所有的该数据库下所有的表的字符集都为utf8,或在建立新数据库时设定字符集 CREATE TABLE xxx ( id int not null auto_increment primary key, name varchar(100), ............ )default charset=utf8 //设定单个表的字符集为utf8 set name utf8在命令提示符中与php页面不同! 在mysql的命令提示符下使用 set names utf8插入中文会报错: ERROR 1406 (22001): Data too long for column 'vote_title' at row 1 在php中对mysql进行操作, 使用mysql_query('SET NAMES UTF8')插入中文成功! 总结: 总之在建立数据库或数据表后面要加上default charset=utf8 插入中文数据时最好不要在命令提示符中插入,有人会问输入命令set names utf8不就行了 哥们你试下,set names utf8后,插入中文数据会报错的! 不用set names utf8, 插入时使用的是msyql的默认字符集(gb2312) ,在php页面中 mysql_query('SET NAMES UTF8')会出现乱码的! mysql在安装的时候不知道你设定默认字符集的是哪种! 至于mysql命今提示符中 set names utf8(表加了default charset=utf8);后报错问题我还是想不透!!!一样的字符集为什么插入就会出错呢,还请高手指点! Generated by Bo-blog 2.1.1 Release