使用LOAD XML LOCAL导入XML到MySQL遇空值与错误值问题求助
解决LOAD XML LOCAL导入MySQL时的空值与错误值问题
先给你梳理几个核心问题,这些应该是导致你导入异常的主要原因:
1. 行识别标签错误
你的LOAD语句里用了ROWS IDENTIFIED BY '<propertyID>',但看你的XML结构,每个数据行是被<property>标签包裹的,<propertyID>只是行里的一个字段标签。MySQL会把你指定的标签当作行的容器,所以它会错误地把<propertyID>内部的内容当作整行数据,自然大部分字段都读不到,出现空值。
修正后的导入语句应该把行识别标签改成<property>:
LOAD XML LOCAL INFILE '/wamp64/tmp/output.xml' INTO TABLE propertyimport CHARACTER SET latin1 -- 明确指定和XML匹配的编码 ROWS IDENTIFIED BY '<property>';
2. XML结构不完整/标签不匹配
你提供的XML示例有明显的语法问题:
- 最后一行的
<property8>标签既没有闭合,也和你表中的字段propertyFeature8名称不匹配(少了Feature),这种标签名不一致的字段肯定会导入空值。 - 整个XML的
<property>和<properties>标签都没有闭合,MySQL解析不完整的XML时会出现各种异常,必须保证XML格式完全合规。
3. 自增主键的处理
你的表中localID是自增主键,但XML里没有这个字段。如果不明确指定字段列表,MySQL可能会尝试从XML中读取对应的数据(自然读不到,导致错误)。最好在LOAD语句里明确列出要导入的字段,跳过自增主键:
LOAD XML LOCAL INFILE '/wamp64/tmp/output.xml' INTO TABLE propertyimport CHARACTER SET latin1 ROWS IDENTIFIED BY '<property>' (propertyID, branchID, clientName, branchName, department, referenceNumber, addressName, addressNumber, addressStreet, address2, address3, address4, addressPostcode, country, displayAddress, propertyFeature1, propertyFeature2, propertyFeature3, propertyFeature4, propertyFeature5, propertyFeature6, propertyFeature7, propertyFeature8, propertyFeature9, propertyFeature10, dateLastModified, timeLastModified, featuredProperty, regionID, latitude, longitude, mainSummary, fullDescription, propertyBedrooms, propertyBathrooms, propertyEnsuites, propertyReceptionRooms, propertyKitchens, propertyAge, floorArea, floorAreaUnits, displayPropertyType, propertyType, propertyStyle, availability, price, forSalePOA, priceQualifier, propertyTenure, saleBy, developmentOpportunity, investmentOpportunity, estimatedRentalIncome, rent, rentFrequency, toLetPOA, studentProperty, lettingFeePolicyHeadline, lettingFeePolicyDetails, forSale, toLet, priceTo, priceFrom, rentTo, rentFrom, floorAreaTo, floorAreaFrom, siteArea, siteAreaUnits, strapLine, landAreaTo, landAreaFrom, landAreaUnits, forSaleLeaseLength, featured, available);
4. 编码验证补充
虽然你已经把表字符集设为latin1,但在LOAD语句中显式指定CHARACTER SET latin1可以确保MySQL用正确的编码读取XML文件,避免因系统默认编码不一致导致的乱码或解析错误。
按上面的步骤调整后,应该能解决大部分空值和错误值的问题。如果还有个别字段异常,建议单独检查该字段的XML标签名、数据类型是否和表字段完全匹配(比如数字类型的字段在XML里是否是有效的数字,空标签是否会被MySQL正确解析为NULL等)。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

