1. 程式人生 > >mysql data too long for column xxx解決方案

mysql data too long for column xxx解決方案

        最近匯入資料的時候,總是報錯:java.sql.SQLException: Data truncation: Data too long for column '***' at row 1 Query,查詢好久,才發現是資料庫的字符集出錯。整理了一下,解決方案為一下幾種.。

第一種解決辦法:

出自:http://www.blogjava.net/zoninge/archive/2009/04/15/265663.html感謝博主!
在頁面中向mysql5.0插入中文資料時提示失敗,將sql語句複製到管理器中,資料庫提示data too long for column "title",我改為一個漢字,還是提示同樣的資訊,換成英文再試一下,正常,應該是字符集除了問題,但是資料庫在建立的時候就選擇的DEFAULT_CHARSET,應該是欄位的問題。
將MySQL安裝目錄下的my.ini檔案中的字符集配置如下(修改完之後,最好重啟一下MySQL服務):
    [mysql]
    default-character-set=gbk
    [mysqld]
    default-character-set=gbk
或者在my.ini裡找到
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
把其中的
STRICT_TRANS_TABLES,
去掉,然後重啟mysql就ok了
    將表和欄位的字符集屬性都改成gbk。
    在每一次MySqlCommand Execute語句時,如果SQL語句或者引數中包含中文,或者是返回的記錄集中有中文(指Select的查詢語句),就在這個Execute的SQL語句之前加一個SET NAMES GBK;。

第二種解決方案:

http://www.cnblogs.com/amboyna/archive/2008/04/21/1163110.html
感謝博主!

data too long for column xxx解決方案

Update:mysql5在phpmyadmin無法連線時執行的語句:
SET PASSWORD FOR ‘root’@'localhost’ = OLD_PASSWORD(’[newpassword]‘);

剛才在匯入資料的時候,navicat報錯:
Data too long for column ‘ip’ at row 1
提示資料對於ip欄位太長

如果資料型別不正確,也會出錯,而不像4.*那樣自動轉換:
sendQuery:Incorrect datetime value: ‘未知’ for column ‘date’ at row 1


如果是資料x (int 11)型別的可能有些奇怪:
insert into a (x) values (’a')
出現:
Out of range value adjusted for column ‘x’ at row 1

insert into a (x) values (’11a’)
出現:
Data truncated for column ‘x’ at row 1

解決辦法:
在my.ini裡找到
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_Create_USER,NO_ENGINE_SUBSTITUTION”
把其中的
STRICT_TRANS_TABLES,
去掉,然後重啟mysql就ok了 
參考博主轉自:Trackback:[url] http://tb.blog.csdn.net/TrackBack.aspx?PostId=2032186[/url]


關於MySQL5中varchar欄位型別的長度定義:


原文稍作了擷取:
http://hi.baidu.com/mcspring/blog/item/63f0dea25e8e7baacbefd0ad.html


藉此機會重新仔細讀了一下MySQL5的文件,其中對varchar欄位型別這樣描述:varchar(m) 變長字串。M 表示最大列長度。M的範圍是0到65,535。(VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,最大有效長度是65,532位元組)。

為何會這般變換?真是感覺MySQL的手冊做的太不友好了,因為你要仔細的繼續往下讀才會發現這段描述:MySQL 5.1遵從標準SQL規範,並且不刪除VARCHAR值的尾部空格。VARCHAR儲存時用一個位元組或兩個位元組長的字首+資料。如果VARCHAR列宣告的長度大於255,長度字首是兩個位元組。

好了,貌似懂了一點。但具體他說的長度大於255時使用2個位元組長度字首,小學減法題:65535 - 2 = 65533啊。不知道這些大牛如何計算的,暫且保留疑問吧?

注:我測試了一下使用UTF8編碼,varchar的最大長度為21854位元組。 
------------------------------------------------------------------
可能人品不好 上面都沒有解決我的問題。我把資料型別換成了longtext  長度不用設定就ok了