今天在windows的DOS視窗下運行mysql命令,insert語句中只要含有漢字資料就出現“data too long for column”錯誤 。
後來在網上查到一篇文章 ( http://www.blogjava.net/sakis/archive/2006/07/14/58242.html),內容如下:
關於MySql5的“data too long for column”錯誤
從MySql5中運行本地指令碼建立資料庫,當插入中文欄位時發生“data too long for column”錯誤。上網一查,發現多位元組使用者大都碰到了這種情況。google搜尋網上的解決方案大都是要將資料庫的編碼方式為GBK或UTF8,可我在安裝MySql時就選擇了UTF8格式。原來錯誤原因是本地的指令檔不是UTF8編碼的,用記事本或UltraEdit將編碼轉為UTF8後問題解決。再次強調,JSP頁面,資料庫聯結接方式,資料庫建立,…,都須一致使用UTF8編碼!
BTW,MySql最近藉著Web2.0的浪潮風頭很勁啊,techn orati(好像這幾天被GFW filter了),flickr,del.icio.us等一批網站都是用了MySql。MySql還專門在首頁開了一大塊來炫耀。
--------------------------------------------
按照他說的方法,通過source命令或者管道匯入sql檔案是沒錯了。但在Console/DOS視窗下運行insert語句帶漢字還是會出現錯誤,為什嗎?經過一番測試,總結出這樣的經驗:
Console下調用程式發出的指令是通過一種編碼格式編碼之後發送出去的字串,接收程式返回的資訊同樣也使用編碼過的字元流。
例如我們要調用:
rename 1.txt 測試.txt
dos下把這行命令用某種編碼方式編碼成字串,如果renmae命令接收到這個命令字串,但錯誤的理解了這個命令參數的編碼,或者console發送這個命令時使用了utf8編碼,而renmae認為是gbk編碼,則該命令會把檔案重新命名成亂碼的名字。(因為中文windows下編碼預設都是gbk,所以我們從來沒遇到過這樣的亂碼問題。在dos視窗左上方右鍵-->屬性,當前字碼頁: 936 (ANSI/OEM - 簡體中文 GBK )驗證DOS視窗是GBK編碼發送字元)
但是,進入mysql命令之後,mysql命令可並不一定知道你發送的指令是GBK編碼的,它可能認為你發送的指令是utf8編碼,或者跟資料庫編碼一致的編碼,或者跟某個全域變數一致的編碼的指令字串( mysql預設用什麼編碼接收指令,我沒有研究清楚,請看官補充 )。所以這時候為了避免mysql誤解你的指令編碼,需要在調用mysql的時候加上--default-character-set=gbk 的參數。即 使用 mysql -uroot -p --default-character-set=gbk 登入即可。注意,不要因為你的資料庫是utf8編碼就使用mysql -uroot -p --default-character-set=utf8去登入。我們這裡說的是dos中發出的指令字串的編碼,dos視窗是不會用utf8編碼去發送指令的。
當然,假設某個console發出的指令是通過utf8字元編碼的,是不是應該用
mysql -uroot -p --default-character-set=utf8 ?沒有試過,但分析應如此。
為什麼用MYSQL-Front/SQLyog這樣的GUI程式執行同樣的sql就沒有問題呢?在mysql-front/SQLyog登入時,就可以指定串連字元集,我猜想,登入進去之後在SQL編輯框中發送的SQL指令也許就是通過這個字元集編碼的,如果跟資料庫一致的話,當然沒有問題了。
附上一個簡單的sql測試代碼:
#drop database test_001;
create database test_001 default character set utf8 collate utf8_general_ci;
use test_001;
create table config (
id smallint not null default '1' ,
name varchar(64) not null ,
descr varchar(64) ,
primary key(id)
);
先建表,然後insert。
use test_001;
insert into config (id, name, descr ) values ( '1', '中文名字', '描述' );
當 mysql命令不使用 --default-character-set 參數,出現
ERROR 1406 (22001): Data too long for column 'name' at row 1
的錯誤
如果使用mysql命令時加上--default-character-set=gbk 的參數,則錯誤排除!
上面測試是在windowsXP中文版,mysql 5.0.27-community-nt
status出來的資訊是:
mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32)
Connection id: 19
Current database: test_001
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.27-community-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 7 hours 41 min 27 sec
===========
其實最簡單的測試方式就是先修改my.ini檔案中的-default-character-set = gb2312或utf8,重啟mysql再輸入資料,如果不行,再考慮以上方法