解決將Excel表匯入到SQL Server資料庫時出現Text was truncated or one or more characters had no match in the target code錯誤
編寫python爬蟲程式可以在電商、旅遊等網站上爬取相關評論資料,這些資料可以用於詞雲製作、感情詞分析、提取關鍵詞等,也可以將爬取下來的資料以自己的方式進行展示。評論資料爬取下來後,就要考慮怎樣入庫,可以在爬蟲程式中編寫程式碼直接入庫,也可以將爬取到的資料存到Excel表格中,再將Excel表格匯入到資料庫中。在將Excel表格匯入到SQL Server資料庫時可能會出現很多錯誤,這裡要解決的錯誤是:Text was truncated or one or more characters had no match in the target code。這是由於欄位大小(size)設定過小,而資料中有超過這個size的記錄從而導致了截斷(truncate)。
在SSMS中,可以編寫SQL語句或使用選單建立資料表,併為表中的欄位設定大小(size)。在將Excel表格匯入到資料庫時,欄位的大小又是怎麼確定的呢?在Excel表格中,第一行的各列值作為資料表(指資料庫中的table)中的各欄位名,第二行以後的每一行的記錄將作為資料表中的記錄。下面兩張圖反映了Excel表中資料和資料表中資料的對應關係。
我們在SSMS中開啟“景點概覽”資料表的設計檢視,檢視各欄位的大小(size)。
Excel表在匯入到資料庫後,欄位的Data Type(資料型別)是根據Excel表中第二行(即第一條記錄)的值推出的。如果第二行對應列的那個值是數字,資料庫中相應欄位的Data Type就是float型,如果值是字元,相應欄位的Data Type就是nvarchar(255)。將數字都作為float型,將字元都作為nvarchar(255)型可以避免一些截斷問題或高精度向低精度轉換等問題的出現。但如果某一個欄位的Data Type被設定成了nvarchar(255),而表中又有記錄的值的大小超過了255,那麼就會出現文章開頭所說的truncate(截斷)問題。所以,將Excel表格的各條記錄中,最長的那條記錄放到Excel表格的第二行(即第一條記錄的位置),就可以解決上面所說的問題
一、準備Excel表格資料
Excel表格是可以匯入到SQL Server的,但是WPS表格是不行的。準備好Excel表格後,另存為成合適的格式(Excel 2003或當前的Excel版本號,後面會用到)。這裡儲存成Excel 2003(.xls)的格式。使用的資料是夫子廟景區的評論資料,首行只有一個欄位“評論”。
二、在SSMS中建立資料庫並匯入Excel表格
開啟SSMS,建立資料庫,右鍵資料庫-Tasks-Import Data,開啟SQL Server Import and Export Wizard。
選擇Data source資料來源為Microsoft Excel表格,選擇準備好的Excel檔案,在Excel version中選擇相應的版本號。已自動勾選的First row has column names表示Excel表格中首行作為欄位值。
選擇匯入Destination為:SQL Server Native Client,Server name是當前SQL Server連線的服務名,應該是自動出現的,Authentication選擇登入方式(Windows身份驗證或SQL Server身份驗證),Database選擇Excel表匯入到的資料庫。
選擇全部匯入或者編寫SQL語句部分匯入(我也不是很明白..)。這裡選擇:Copy data from one or more tables or views,全部匯入。
Next之後,選擇Excel表中的工作簿(這裡只有一個夫子廟)。
點選Edit Mappings,可以看到“評論”欄位的Data Type被設定成了nvarchar(255)。這裡要注意,雖然在這裡Size這個值是可以更改的,但是即使改為max後依然匯入失敗(沒有解決)。
繼續後續步驟,執行匯入。
點選完成,匯入失敗,查看出錯日誌。
三、整理Excel表格資料重新匯入
上面的Excel表格匯入失敗了,在整理表格之前,要在SSMS中將失敗的資料表刪掉(雖然失敗了,但是資料表的框架已經建立了)。如果對錶格進行SELECT查詢,結果是空的。
開啟Excel表格,找到最長的那條記錄,並將其移動到第二行。
重新匯入到資料庫,這次匯入成功了。
在SSMS中,SELECT查詢剛才匯入進來的資料。Excel表格匯入進來的資料表的名字是Excel表中資料簿的名字後+"$"符號。
四、總結
在將Excel表格匯入到SQL Server資料庫時如果出現:Text was truncated or one or more characters had no match in the target code 這個錯誤,將Excel表中最長的那條記錄移到第二行即可(即第一條記錄所在行)解決匯入失敗的問題。
另外,SQL Server資料庫的匯入匯出功能還可以實現資料庫中資料匯出到Excel表或其他一些資料來源之間的相互匯入匯出,讀者可以進行嘗試。