我的表中有大量数据错误地保存了“?
”符号而不是正确的符号。
由于编码差异导致大多数(如果不是全部),因此不是保存á,é,í,ó,ú and ñ
(以及每个版本的大写版本),而是保存所有内容,例如“?
”
Se?ora < Señora
Espa?na < España
Jos? < José
Del r?o < Del río
依旧......
显然,我无法直接知道,如果?
表示任何á,é,í,ó,ú or ñ
,但是我有另一张表,其中包含正确的值(带有重音字母)和ñ)对于我需要的列中的大多数字段。
我的问题是,如何构建一个查询(或PHP中的脚本),它将更新表A中的列(错误的一个),以便用B中的正确值替换值。
请注意,每个“对”列(来自A和B)总是相同的长度,所以唯一的区别是在A中他们有'?'符号,在B中他们有正确的字母。考虑到这一点,我想我可以使用like构建某种查询,并且每次都使用like
,在like命令中用á,é,í,ó,ú and ñ
替换任何_
。
e.g:
如果B中的正确列为'de la peña'
,则like
将为'de la pe_a'
,因此它将与A中的'de la pe?a'
匹配,然后我只需要替换A与B中的一个,有效地将'de la pe?a'
替换为'de la peña'
。
问题是我不知道如何制作这样的查询/脚本。
任何想法?
注1,我知道一个好主意是简单地用A替换A,但问题是B的记录比A少得多,所以我只能修复A中的错误记录。在B中有一对匹配。
注意2.我已经知道如何从现在开始正确保存新数据(这是一个字符集问题),现在新记录正确保存,但我需要修复错误 OLD 已存在的数据......
答案 0 :(得分:1)
我想我会做的是:
首先,创建一个新表,将正确的值映射到相应的不正确的值。它看起来像这样(我们称之为表C):
(ID,CorrectValue,IncorrectValue)
(1,peña,pe?a)
(2,Señora,Se?ora)
将表B与PHP和regex一起使用以生成表C.从表B中拉出正确的值,使用正则表达式将相关字符替换为?
,然后插入这些新对(表中的正确值) B,与其现在不正确的值(作为单独的字段)一起进入表C.
下面是一个如何为表C准备插入的示例(假设您已连接到数据库并从表B中选择要查看$ result变量的项;我假设mysqli在这里):
$inserts = array();
while ($row = $result->fetch_assoc()) {
$correctvalue = $row['CorrectValue'] //assumes your select statement has returned CorrectValue as your candidates for correct values
if (preg_match("/[áÁéÉíÍóÓúÚñÑ]/i",$correctvalue)) { //only process those items that actually have one of the target characters
$insert = array();
$insert['CorrectValue'] = $correctvalue;
$insert['IncorrectValue'] = preg_replace("/[áÁéÉíÍóÓúÚñÑ]/i","?",$correctvalue);
$inserts[]=$insert;
}
}
//and then process your inserts into Table 3
一旦你设置了表C,就可以很容易地从表A中更新那些与表C中的错误值匹配的项,并使用表C中的正确值.SQL可能看起来像这样:
UPDATE TableA SET TableA.WrongValue = TableC.CorrectValue WHERE TableA.WrongValue = TableC.WrongValue;
这当然不会考虑那些不在表B中的项目,但如果该列表很小(您将表B描述为包含大多数,那么希望它是),这可能会节省你很多时间。