通过bcp方式从mssql->tidb数据迁移过程中,空值数据导入完之后变成 \0

------------------ 在 mssql 数据 的状态

这个是 bcp方式 从mssql导出到 csv文件的内容

-------------------------- 下面这个是 csv load到 tidb的sql 语句

LOAD DATA LOCAL INFILE ‘\\172.33.6.70\DB_Share\OrderCurrent\OrderInfos.csv’
INTO TABLE Data_Temp.OrderCurrent_OrderInfos
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ‘{fgf}’
ENCLOSED BY ‘"’ LINES TERMINATED BY ‘{hfgf}’
( Id,UserId,PickupTime,ActualPickupTime,DropoffTime,ActualDropoffTime,CarTypeId,CarId,CarGroupId,Status,HolidayId,ChannelId,EnterpriseId,OrderType,PaymentType,IsPrepay,PriceType,UsageType,OrderTag,TotalAmount,LastModificationTime,CreationTime,PickupAddressDetail,PickupAddressName,PickupCityId,PickupLatitude,PickupLongitude,PickupStoreId,DropoffAddressDetail,DropoffAddressName,DropoffCityId,DropoffLatitude,DropoffLongitude,DropoffStoreId,OrderFrom,RowVersion,IsDeleted,PriceGroupId );

----------------------------------- 当load完之后 ,原本在mssql 中 是null的数据 现在在 tidb中 会变成 \0

--------------------将 tidb中的数据 复制 到 excel 中也何 验证,excel中可见 是 \0

image

请各位技术同学,帮忙 看一下,是否可以解决这个问题,目前这个问题 会影响到后面所有的sql迁移工作量的评估

你好,
辛苦提供下 tidb 版本: select tidb_version();
可以提供下复现的 csv 文件内容和表结构.

Release Version: v4.0.0
Edition: Community
Git Commit Hash: 689a6b6439ae7835947fcaccf329a3fc303986cb
Git Branch: heads/refs/tags/v4.0.0
UTC Build Time: 2020-05-28 01:37:40
GoVersion: go1.13
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false

tidb4.0问题反馈信息.7z (70.0 KB)

给个文本格式的?我这边显示有点问题。

我这个就是文本格式 ,csv 的, 由于公司内各个 业务线数据内容不同,我们自行设置了 {fgf} 为字段分隔符,设置 {hfgf} 为 行分隔符

--------------------------下面是 bcp 方式 从 msql 导出 csv 的语句
bcp “DECLARE @MinRV_TIDB bigint;DECLARE @MaxRV_SQL bigint;SET @MinRV_TIDB =(SELECT MinRV_TIDB FROM [Data_Sync].dbo.[RowVsersion_Reduce] WHERE DBNAME = ‘’’’’+@DBNAME+’’’’’ AND TABLENAME = ‘’’’’+@TABLENAME+’’’’’);SET @MaxRV_SQL =(SELECT MaxRV_SQL FROM [Data_Sync].dbo.[RowVsersion_Reduce] WHERE DBNAME = ‘’’’’+@DBNAME+’’’’’ AND TABLENAME = ‘’’’’+@TABLENAME+’’’’’);’+@SelectSql+’ where Rowversion > ISNULL(@MinRV_TIDB,0) AND Rowversion <= ISNULL(@MaxRV_SQL,0) ;” queryout \ftp服务器地址\DB_Share’+@DBNAME+’’+@TABLENAME+’.csv -S"服务器地址" -U"Report_XXX" -P"此处填写服务器密码" -c -C"65001" -t"{fgf}" -r"{hfgf}"

load 导入时存在大量数据截断和格式报错

| Warning | 1265 | Data Truncated |
| Warning | 1292 | Incorrect datetime value: ‘’ |

此外 vim 看到 csv 文件中对应空值数据的符号是 ^@


^@ 在 vim 中表示 ASCII 码中的 NULL 字符,编码为 0x00,占用一个字节

要表示空值两个间隔符{fgf}之间应该不包含任何字符,null 值则表示为 \N

建议使用 4.0.7 版本的 tidb,先向表中写入一些内容正确的 sample 数据,然后导出为 csv 格式文件(4.0 版本支持 select … into outfile … )

select * from {table} into outfile ‘sample.csv’ fields terminated by ‘{fgf}’ lines terminated by ‘{hfgf}’;

然后对比修正下从 mssql 导出的 csv 的格式内容,再向 tidb 导入数据,并确认导入时没有 warning 报错