在windows的DOS視窗下執行mysql命令,insert語句中只要含有漢字資料就出現“data too long for column”錯誤 。 ...

lansefeiyang122發表於2009-12-12

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指令也許就是通過這個字符集編碼的,如果跟資料庫一致的話,當然沒有問題了。

相關文章