完美解決mysql下utf-8的亂碼問題

建表時先加上default charset=utf8;php

插入中文數據以前(Mysql命令提示符下)是用set names gb2312;html

在php頁面中設置是mysql_query('SET NAMES UTF8');mysql

在php頁面(已設定爲utf8後)中插入中文數據不會出現亂碼,應該插入數據庫的時候就是以utf8字符集插入中文數據的故不會出現問題!sql

在php頁面前面不要忘了加上header('content-type;text/html;charset=utf-8');數據庫

你們在MySQL命令提示符下想查看數據,中文數據有多是以下 '?????'編程

因此你們想查看到正確的中文要與插入中文數據同樣使用set names gb2312;windows


例子:服務器

CREATE DATABASE mydb;工具

USE mydb5;fetch

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格式的中文的。

相關文章
相關標籤/搜索