建表時先加上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格式的中文的。