Karakterkodning i MySQL stored procedures

Tags:    mysql

Kære udviklere !

Jeg er stødt på et ret enkelt, men ikke desto mindre meget irriterende problem.

I en database oprettet i MySQL Workbench 6.3, har jeg oprettet en stored procedure, som skal indsætte værdier i en bestemt tabel. Det virker sådan set fint, men der er det problem at de indsatte data ikke har den korrekte karakterkodning, som databasen ellers er defineret til. De danske bogstaver æ,ø og å, bliver til de velkendt spørgsmålstegn i browseren, præsenteret med php. Der er heller ikke overensstemmelse mellem hvordan karakterene ser ud i tabellen, i forhold til dem der ligger der i forvejen, altså ikke et php/browser-problem.

Jeg har virkelig forsøgt at finde et svar ved at google, og jeg har prøvet mig frem på alle mulige måder, ved at ændre definitionen af karakterkodningen, men det vil bare ikke virke !

Vedlagt er kode af det MySQL script der genererer den pågældende stored procedure. Ved kørsel ses ingen fejl.

Fold kodeboks ind/udSQL kode 


Jeg håber at nogle af udviklerne har et svar. Problemet må være kendt af alle der bruger bogstaver og karakterer ud over dem der findes i det engelske alfabet.

Tak ! :)



2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Hej Keld,

Det kan gå galt med encoding flere steder i din proces, men groft sagt vil jeg mene der er 3 hovedområder:

1) Når data modtages
2) Når data sættes i databasen
3) Når data vises igen

Din SQL viser at du bruger utf-8, hvilket jeg kun er glad for.
Start med at tjekke at dine php sider der modtager og vises data alle er i utf-8 selv (altså gerne både php filen på serveren og den html-side den genererer til browseren).
Virker det stadig ikke bør du kikke nærmere på et ændre default_charset for php (php.ini) og måske mysql/mysqli char_set funktionen ... hold dig til uft-8 alle steder, og du burde være rimelig safe.
Se eventuelt her: https://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql

Kom tilbage med mere info hvis det stadig ikke virker.




Hej Jonatan og mange tak for dit svar. Jeg var lige ved at tro at ingen af udviklerne kunne eller ville svare. :)

Det er helt rigtigt hvad du skriver. UTF8 skulle løse alle problemer, men jeg har også erfaring for at Latin1 kan være nødvendigt til brug i browsere. Du har nemlig også helt ret i at mine data er tiltænkt præsentation i en browser, nærmere betegnet Firefox.

Databasen, lavet i MySQL Workbench, har karakterkodning så præsentation af data hentet i MySQL databasen, fungerer uden problemer, og æ,ø og å er helt rigtige. Derfor tror jeg ikke umiddelbart at mit lille problem har noget med browseren eller php-scriptet at gøre.

Når jeg kalder en stored procedure, som er genereret ud fra det script jeg vedhæftede i første omgang, er databasens oprindelige data ok, men der er fejl i karakterkodningen for det indsatte data, hvor æ,ø og å erstattes af spørgsmålstegn.

I browseren er databasens oprindelige data ok, men de data der er sat ind med en stored procedure, er forkerte.

Hvis jeg derimod ser i tabellen, inde i MySQL Workbench, er det omvendt. Her er de oprindelige data vist med forkert karakterkodning, og dem der er indsat med stored procedure, rigtige.

Det siger mig noget om at fejlen opstår når en stored procedure skal sætte data ind, og at problemet skal løses her, med en definition af karakterkodningen.

Jeg har prøvet alt muligt, og jeg har afprøvet alt hvad jeg kunne google mig frem til - uden held !

Tilbage til UTF8 kontra Latin1 problematikken. Min praktiske erfaring har vist, at for at få databasen til at virke, har det været nødvendigt at kombinere Latin1 og UTF8.UTF8 har været brugt i tabeldefinitionerne, og Latin1 ved indsættelse af data i tabellerne, med load data local infile. Det virker !

Jeg vil naturligvis gerne kikke på de ting du har foreslået. Tak for det!


Update :

Hej Jonatan. Nu har jeg fundet løsningen. Tidligere definerede jeg karakterkodningen default i databasen som utf8 og utf8_danish_ci i tabeldefinitionerne, mens jeg brugte Latin1 ved indsættelse af data i tabellerne. Grunden til dette var at den rene brug af utf8 gav karakterkodningsfejl i browseren. Dette er løst ved at ændre i my.ini config-filen til MySQL. Adgang findes i kontrolpanelet i XAMPP, som jeg bruger. My.ini er nu konfigureret så utf8 indstillingerne er aktive. Jeg har så måttet ændre scriptet til et par databaser, men nu virker det hele og jeg bruger konsekvent utf8 i alle MySQL databaser. Tak for hjælpen. :)




Indlæg senest redigeret d. 25.03.2017 16:16 af Bruger #21434
t