今天在windows的DOS窗口下運行mysql命令,insert語句中只要含有漢字數據就出現「data too long for column」錯誤 。javascript
後來在網上查到一篇帖子 ( http://www.blogjava.net/sakis/archive/2006/07/14/58242.html),內容以下:html
關於MySql5的「data too long for column」錯誤java
從MySql5中運行本地腳本建立數據庫,當插入中文字段時發生「data too long for column」錯誤。上網一查,發現多字節用戶大都碰到了這種狀況。google搜索網上的解決方法大都是要將數據庫的編碼方式爲GBK或UTF8,可我在安裝MySql時就選擇了UTF8格式。原來錯誤緣由是本地的腳本文件不是UTF8編碼的,用記事本或UltraEdit將編碼轉爲UTF8後問題解決。再次強調,JSP頁面,數據庫聯接接方式,數據庫建立,…,都須一導致用UTF8編碼!mysql
--------------------------------------------sql
按照他說的方法,經過source命令或者管道導入sql文件是沒錯了。但在Console/DOS窗口下運行insert語句帶漢字仍是會出現錯誤,爲何?通過一番測試,總結出這樣的經驗:
Console下調用程序發出的指令是經過一種編碼格式編碼以後發送出去的字符串,接收程序返回的信息一樣也使用編碼過的字符流。數據庫
例如咱們要調用:windows
rename 1.txt 測試.txtjsp
dos下把這行命令用某種編碼方式編碼成字符串,若是renmae命令接收到這個命令字符串,但錯誤的理解了這個命令參數的編碼,或者console發送這個命令時使用了utf8編碼,而renmae認爲是gbk編碼,則該命令會把文件重命名成亂碼的名字。(由於中文windows下編碼默認都是gbk,因此咱們歷來沒遇到過這樣的亂碼問題。在dos窗口左上角右鍵-->屬性,當前代碼頁: 936 (ANSI/OEM - 簡體中文 GBK )驗證DOS窗口是GBK編碼發送字符)ide
可是,進入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編碼去發送指令的。post
固然,假設某個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再輸入數據,若是不行,再考慮以上方法
出處:http://www.cnblogs.com/ovliverlin/archive/2007/11/26/972549.html
我感受出現這個問題的緣由是:sql的編碼是UTF-8的,而插入時的漢字的編碼是多是GBK,因此插不進去,個人解決方法是經過程序插中文,由於在程序中插入時的編碼同mysql是一致的,還有一種解決方法(我感受):把mysql的編碼設置成GBK就應該沒問題~ 感受上面我說比我說的要細緻要清楚,因此轉載留着之後查閱