完美解决mysql下utf-8的乱码问题

建表时先加上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‘)插入中文成功!

<?php
header(‘content-type:text/html;charset=utf-8‘);
$link=mysql_connect(‘localhost‘,‘root‘,123456);
mysql_select_db(‘mydb‘);
mysql_query(‘set names utf8‘);
$sql="SELECT * FROM ";
$sql1="INSERT INTO baidu VALUES(‘大哥帮帮忙!‘)";
$result1=mysql_query($sql1,$link) or die(‘Error:‘.mysql_error());
$result=mysql_query($sql,$link);
while ($re_arr=mysql_fetch_assoc($result))
print_r($re_arr);
?>

总结:

总之在建立数据库或数据表后面要加上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);后报错问题我还是想不透!!!一样的字符集为什么插入就会出错呢,还请高手指点!

回复:
原先我是使用GBK作为编码格式的,但是为了更好的国际化,在项目中把编码重新做成了UTF8的啦。
对于你“set names utf8(表加了default charset=utf8);”还是报错的问题,不知道你发现没有,其实无论是php界面,还是命今提示符的方式,都是mysql数据库的用户接口,在你往数据库中插入数据的时候,必须把这些“用户接口”的字符编码设置成与数据库存储时的字符编码相同,这样才能正常的显示。
就像你在php中加入header(‘conten-type:text/html;charset=utf-8‘)的意思一样,你需要把命今提示符的字符编码设置成UTF8,然后再做相应的数据库操作,但是windows下的命今提示符字符编码只有一种GBK,它兼容GB2312,所以在你使用“set names gb2312”的时候,能正常操作。但是GBK对UTF8却不兼容,换句话说,UTF8字符集包括GBK的,然后GBK又包括GB2312的,所以感觉 “set names utf8”这句话设置了也没起什么用呢。不过,据我google以后知道,好像windows下的命今提示符字符编码是修改不了的,还是忍了吧。建议,如果你想操作UTF8编码的MySQL数据库还是使用PHP终端呢

最好、最通用的编码格式是utf-8,这时一种8位的Unicode字符集。它对于8位的西欧字符集来说,比较节省空间,而又能够有效地表示汉字等字符。
 
因此,将MySQL数据库服务器设置为utf-8格式,把所有的MySQL数据库也设置为utf-8格式,这是最佳的选择!全世界所有语言都可以很好的得到支持!
 
但是,一些常用的MySQL工具无法显示utf-8格式的中文。如,MySQL自带的工具,MySQL-Front等软件。但是,MyManger和命令行下的MySQL是可以正常显示utf-8格式的中文的。

完美解决mysql下utf-8的乱码问题

时间: 2024-10-10 01:14:23

完美解决mysql下utf-8的乱码问题的相关文章

完美解决微信下拉上拉

转http://note.youdao.com/share/?id=f13df2c846cac5d4f0e24a715d8372a6&type=note#/ 完美解决微信下拉上拉回弹 1.使用jroll.js完美解决,下载jroll.js. 2.DOM结构为: class container 为滑动页面 3.添加css #wrapper { position: absolute; top: 44px; bottom: 0; width: 100%; } 4.编写js <script src=

完美解决 Linux 下 Sublime Text 中文输入

首先,我参考了好几篇文章,都是蛮不错的,先列出来: sublime-text-imfix:首先推荐这个方法,最简单,但是在我的系统上有些问题.可用这个的强烈推荐用这个 完美解决 Linux 下 Sublime Text 中文输入:讲的比较明白,也可用参考. Ubuntu下Sublime Text 3解决无法输入中文的方法: 讲解的最清楚了,建议看看. 测试系统:Ubuntu 14.04 (理论上所有 Linux 发行版都通用) 输入法:Fcitx 4.2.6.1 Sublime Text 版本:

xampp mysql下的中文是乱码

http://www.2cto.com/database/201204/126775.html apache 80端口被占用 mysql 3306端口被占用 XAMPP下MYSQL中文乱码问题的解决 现象描述: 安装完成XAMMP后,内置有MySQL数据库. 新建自己的数据库---新创建数据库表--通过jdbc往表里面添加中文记录---存储进去的中文全都变成了乱码.  www.2cto.com 问题解决: 1.找到安装目录下的D:\xampp\mysql\bin\my.ini,打开: 2.找到标

解决linux下unzip中文有乱码的问题

xxx.zip 中有中文的文件,在linux下unzip就会有乱码. 解决办法:安装7zip 去http://sourceforge.net/projects/p7zip/files/latest/download?source=typ_redirect 下载 p7zip_9.20.1_src_all.tar.bz2 上传到服务器tar -jxvf ,再make.make install. 解压文件:7za x xxx.zip 就OK了

完美解决ubuntu下sublime中文输入问题

声明 1.本人整理文章,转载请注明出处. 2.参考资料 http://my.oschina.net/tsl0922/blog/113495 问题描述 在ubuntu下想使用sublime,但是不能输入中文,很尴尬啊,参考了一位中国大神的方法,再针对自己实际情况修改,成功了,哈哈. 使用环境 Ubunt Kylin 14.04, sublime text 2, 搜狗输入法. 解决方法 1. 保存下面的代码为sublime_imfix.c 1 /* 2 sublime-imfix.c 3 Use L

如何解决mac下javac显示出乱码的问题。

进入终端1.输入cd ~2.输入 touch .bash_profile3.open -e .bash_profile 然后在bash_profile下输入export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8并保存. 返回终端输入source .bash_profile 即可解决

解决resin下jsp中文一直乱码

工作中遇到一个乱码问题: 项目编码格式统一指定为UTF-8,jsp文件,jsp文件头pageEncoding设置为UTF-8,resin/conf/app-default.xml 中加入 <character-encoding>UTF-8</character-encoding>,在访问时还是 显示为乱码. 最终解决方法: jsp文件头中加入contentType="text/html;charset=utf-8" 至于原理,看下下面,从网上找的: 关于JSP页

解决windows下FileZilla server中文乱码问题

最利用cuteftppro FTP做文件夹同步,发现中文的文件夹及文件名都出现了乱码问题, 一开始以为是cuteftppro的问题,谷哥度娘找了一堆的解决方案都没有解决乱码问题,真是头疼啊! 后来终于在网上找到一点资料是关于FileZilla server中文乱码的问题,以前低版本是不会有这样的问题的 大意说是从0.9.14版之后用的字符集是UTF8,使用0.9.14及之前的版本是没有中文乱码问题的(经测试过确实是没有中文乱码问题) 幸好有filezlliaPV这个补丁(http://sourc

完美解决 Linux 下 Sublime Text 中文输入(转载)

1.保存下面的代码为sublime_imfix.c /* sublime-imfix.c Use LD_PRELOAD to interpose some function to fix sublime input method support for linux. By Cjacker Huang <jianzhong.huang at i-soft.com.cn> gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config