解决将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表或其他一些数据源之间的相互导入导出,读者可以进行尝试。