2010-01-15 8 views
2

J'importe parfois des données de fichiers CSV qui m'ont été fournis dans une table mysql.php mysql: supprimer un caractère spécial de la base de données

Dans le dernier cas que j'ai fait, certaines des entrées ont un mauvais caractère bizarre devant les données réelles, et il a été importé dans ma base de données. Maintenant, je cherche un moyen de le nettoyer.

Les mauvaises données sont dans la colonne mysql 'email', il semble toujours être juste devant les données réelles. En essayant de l'imprimer sur mon écran en utilisant PHP, il apparaît comme . Lors de l'exportation vers un fichier CSV, cela ressemble à Â, et si je l'ai SET CHARACTER SET utf8 avant de l'imprimer à l'écran en utilisant PHP, cela ressemble à un espace normal ''.

Je pensais à écrire un script PHP qui va parcourir toutes mes lignes une à la fois, réparer le champ d'adresse e-mail et mettre à jour la ligne. Cependant, je ne suis pas tout à fait sûr de la partie "réparer le courriel"! Je pensais peut-être faire un "exploser" et utiliser le mauvais caractère comme un délimiteur, mais je ne sais pas comment taper ce caractère dans mon code.

Y at-il peut-être un moyen de trouver la valeur sous-jacente/utf8/hex ou quelque chose de ce caractère, puis le trouver dans la chaîne?

J'espère que c'est assez clair.

Merci

EDIT: Dans Hex, on dirait qu'il est A0. Que puis-je faire pour rechercher et supprimer un caractère par sa valeur hexadécimale? Que ce soit en PHP ou directement dans MySQL Je suppose ...

Répondre

1

Je pense avoir trouvé une réponse PHP qui semble fonctionner de façon plus fiable:

$newemail = preg_replace('/\xA0/', '', $row['oldemail']); 

Et alors je vais mettre à jour la ligne avec le nouvel email

+0

ça a marché! (Les commentaires doivent être au moins 15 caractères, donc j'ajoute ceci) –

1

vous pouvez couper tout premier plan unprintable ascii omble chevalier avec quelque chose comme:

update t set email = substr(email, 2) where ascii(email) not between 32 and 126 

vous pouvez obtenir la valeur ascii du char incriminé avec ceci:

select ascii(email) as first_char 
+0

Le problème est que toutes les lignes n'ont pas ce problème. Donc je ne veux pas effacer les premiers caractères légitimes. –

+0

vous pouvez utiliser un où (ajouté ci-dessus) – jspcal

+0

cela sélectionne presque toutes les lignes. Je pense que quelque chose ne va pas avec la partie WHERE. Ne devrait-il pas seulement vérifier le premier char? –

1

SELECT HEX (champ) Table FROM; devrait aider à déterminer le caractère.

+0

On dirait que c'est 'A0'. Cela aurait-il un sens? –

+0

oui c'est le caractère d'espace insécable.essayez de voir si vous pouvez vous en débarrasser avec replace (sur un ensemble de données de test) set de mise à jour de la table email = replace (email, char (160), ''); – ggiroux

+0

il a dit 87 lignes affectées encore il semble toujours le même –

1

Comme alternative, il pourrait être plus facile de résoudre le problème à la source. J'ai rencontré des problèmes similaires avec les fichiers CSV exportés à partir d'Excel et ont généralement constaté que d'utiliser quelque chose le long des lignes de ...

$correctedLine = mb_convert_variables('UTF-8', 'Windows-1252', $sourceLine); 

... tend à corriger le problème. (Cela dit, vous devez vous assurer que vous avez l'extension de chaîne multi octets compilé dans/activé.)

Questions connexes