speciale tekens in een MYSQL database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • erwin85
  • Registratie: Juli 2002
  • Laatst online: 20-09 15:54
Hallo,

Voor een website die ik heb gemaakt heb ik een upload systeem gemaakt waarbij de klant een csv bestand kan uploaden met namen en adressen van personen. Nu loop ik elke keer tegen problemen aan.

Sommige namen bestaan uit speciale tekens zoals ë of é. Nu had ik eerst een functie gemaakt waarbij die voor het uploaden al die tekens omzet naar HTML tekens, Á bijvoorbeeld. Bij deze website zit ook een zoeksysteem waar je kan zoeken naar de namen. Nu geeft natuurlijk ook problemen als je bijvoorbeeld wil zoeken naar Möller.

Een oplossing was dacht ik om utf8 encodering te gerbruiken zodat hij niets met die tekens moet doen, en dus normaal in de database moet komen te staan. Dit deed ik door bij het openen van de database binnen PHP deze functie aan te roepen: mysql_set_charset('utf8',$connection); Bij het toevoegen van deze functie krijg ik geen rare tekens meer maar dan krijg ik het volgende probleem. Inplaats van dat er Möller in de database staat, staat er alleen de letter M. Wat is dit nu weer.... :$

Ik ben nu een beetje ten einde raad. Zou iemand hier een oplossing voor weten?

Alvast heel erg bedankt!

Acties:
  • 0 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Zullen we gewoon afspreken dat we letters met accenten etc niet meer speciaal noemen. Dat zijn ze niet. Zie ook "The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Domweg de verbindings-encoding aanpassen is niet zo zinvol. Je zal die gelijk moeten stellen met wat voor data je daadwerkelijk binnenkrijgt. Als je een van de ISO8859-varianten of win-1250 binnenkrijgt, dan is de bytecode van die o-umlaut niet een geldig UTF-8 karakter.
Als je de warnings van MySQL (die een beetje verborgen worden, SHOW WARNINGS als query uitvoeren na je eerdere insert/update zou wel wat moeten doen) zou opvragen, zou je er waarschijnlijk wel een melding van zien.

Je zal dus ofwel de karakters in je php-code moeten omzetten naar UTF-8 alvorens je variabelen in je query te stoppen, of juist niet UTF-8 specificeren op je verbinding naar MySQL, maar de gebruikte encoding van je pagina's.

Als het opslaan e.d. allemaal wel goed ging, dan rest je enkel nog ook bij het uitvragen weer ervoor te zorgen dat je uit MySQL de goede encoding terugkrijgt ivt wat je op de pagina beweert dat de karakters zijn.

[ Voor 14% gewijzigd door ACM op 04-12-2010 18:55 ]


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 14:39

Johnny

ondergewaardeerde internetguru

Je moet niet alleen de databaseconnectie maar ook de tabellen en velden op UTF-8 zetten. Ook moeten je HTML-pagina's de juiste headers en meta-tag hebben.

code:
1
2
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER DATABASE database_name DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;


De CSV die mensen uploaden geeft geen codering mee, dus je kan niet weten hoe de karakters gecodeerd zijn. Je moet gebruikers zelf de mogelijkheid geven om daar aan te geven welke codering ze gebruiken, maar dat snapt niemand, dus je moet het op één of andere manier zien te raden. Dat is meteen ook één van de redenen dat CSV best wel kut is.

[ Voor 33% gewijzigd door Johnny op 04-12-2010 18:57 ]

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • erwin85
  • Registratie: Juli 2002
  • Laatst online: 20-09 15:54
Mijn database en tabbel staat op UTF-8 en mijn meta-tag ook: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> En in het php bestand heb ik dit toegevoegd: error_reporting(E_ALL);
Ik krijg geen warnings.

Officieel is het een Excel bestand met data. Ik vraag aan de klant of hij het als csv opslaat om het dan te uploaden. Zien jullie misschien een betere oplossing om de data in de database te krijgen?

[ Voor 31% gewijzigd door erwin85 op 04-12-2010 19:15 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Je gaat in je applicatie er dus overal van uit dat alles overal UTF8 is, maar weet je wel zeker dat je geimporteerde csv bestanden wel UTF8 zijn? (Het antwoord hierop is trouwens "nee")

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • erwin85
  • Registratie: Juli 2002
  • Laatst online: 20-09 15:54
ik ben er uit gekomen. ik heb nu als charset iso-8859-1 en in mijn database als latin1. En dit bleek te werken.

In ieder geval bedankt voor jullie hulp!

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Als je toch je database aan het aanpassen bent, zet dan gelijk alles op UTF-8. Dan los je het probleem voor eens en altijd op. Nu zit je weer precies met hetzelfde probleem als je bijvoorbeeld een euroteken wil opslaan in de database.
Pagina: 1