如何使用'?'修复列MySQL中的字符

时间:2013-12-03 16:59:16

标签: php mysql character-encoding

我的表中有大量数据错误地保存了“?”符号而不是正确的符号。

由于编码差异导致大多数(如果不是全部),因此不是保存á,é,í,ó,ú 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 已存在的数据......

1 个答案:

答案 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描述为包含大多数,那么希望它是),这可能会节省你很多时间。