我有一个大型数据库,其中包含大量无效的序列化数据。
数据由PHP序列化,并且在每种情况下都是反序列化失败,其中一个值的字符串长度关闭。
k
我想将所有序列化数据导出为CSV,找到所有损坏的字段,然后修复或删除它们。
我认为这可以用正则表达式完成...对于每一行找到每个s:[length],检查下一个冒号后的引用值是否等于数字[length]。如果长度不匹配则返回整行。
非常感谢任何帮助。如果你能提供一个返回序列化数据破碎行的mysql查询,那就超级好了。
答案 0 :(得分:2)
这可能会被清理一下,但有效:
$result = preg_replace_callback('/s:\d+:"([^"]+)"/',
function($m) {
return 's:'.strlen($m[1]).':"'.$m[1].'"';
}, $string);
strlen()
在MySQL方面,您可以尝试mysql-udf-regexp。