我正在运行 bcp 命令将一些测试数据从本地 Linux 加载到远程 mssql 数据库。数据是半随机生成的整数,用于测试目的。
bcp test_load in /tmp/small_insert_test.csv -S <Server> -U <UID> -P <PWD> -d <DB> -f bcp.fmt -u
bcp.fmt 看起来像:
14.0
3
1 SQLINT 0 4 "," 1 site_id ""
2 SQLINT 0 4 "," 2 view_id ""
3 SQLINT 0 4 "\n" 3 content_id ""
目标表test_load是一个简单表,字段为site_id、view_id和content_id,均为INT。
奇怪的是,当 bcp 工作时,插入的数据与源数据并不相似。
这是全部源数据:
6,47603,4519004
6,47603,4521834
6,47603,4521904
6,47603,4521924
6,47603,4521934
6,47603,4522024
6,47603,4522094
6,47603,4522134
6,47603,4522544
6,47603,4522624
但是这是当我查询 select * from test_load 时插入的数据(忽略引号等,这只是由于我将其复制到剪贴板的方式所致)
"54" "808859444" "959526196"
"54" "808859444" "825374004"
"54" "808859444" "825374004"
"54" "808859444" "825374004"
"54" "808859444" "825374004"
"54" "808859444" "842151220"
"54" "808859444" "842151220"
"54" "808859444" "842151220"
"54" "808859444" "842151220"
"54" "808859444" "842151220"
这是我运行 bcp 得到的输入
Starting copy...
10 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 124 Average : (80.6 rows per sec.)
我无法理解 bcp 在这里做什么。我已截断并重新运行 bcp 几次,这些值是一致的。看起来它以某种方式将原始整数转换为不同的值,但我不明白为什么。
我能够找到解决方案。问题在于 bcp.fmt 文件使用 SQLINT 而不是 SQLCHAR。尽管这些值是整数,但当 bcp 看到 SQLINT 时,显然假定数据是二进制的,因此它正在扩展整数。
*以字符格式存储的数据文件使用char作为文件存储类型。因此,对于字符数据文件,
是出现在格式文件中的唯一数据类型。SQLCHAR
我还将行终止符从 ' ' 到 ' '.