Avatar billede htx98i17 Professor
05. december 2008 - 14:10 Der er 14 kommentarer og
1 løsning

hvordan fungerer SET NAMES utf8

Hvordan fungerer "SET NAMES utf8", hvad gør den præcist? og hvor i koden skal den bruges?
Avatar billede pidgeot Nybegynder
05. december 2008 - 14:20 #1
Kort forklaring: Den bestemmer tegnsættet for kommunikation mellem klient og server.
Længere forklaring: Se http://dev.mysql.com/doc/refman/5.0/en/set-option.html.

Den skal bruges så snart du har oprettet forbindelse til databasen - eller også skal MySQL-serveren sættes op, så de ting SET NAMES sætter (se linket), bruges som standardværdier til alle forbindelser.
Avatar billede htx98i17 Professor
05. december 2008 - 14:26 #2
http://dk.php.net/manual/en/function.mysql-set-charset.php

Her står der at SET NAMES ikke bør bruges. De skriver at man skal bruge mysql_set_charset()


Kan man så konvertere fra et tegnsæt til et andet med:

mysql_set_charset("utf-8");
mysql_query("UPDATE t SET felt = felt, felt2 = felt2, etc");

(PHP-funktioner)
Avatar billede showsource Seniormester
05. december 2008 - 14:33 #3
I phpmyadmin, ændres "collation" med f.eks. flg.
ALTER TABLE `guest_book` CHANGE `message` `message` TEXT CHARACTER SET utf8 COLLATE utf8_danish_ci NOT NULL

Ved ikke lige om det er hvad du er ude efter?
Avatar billede showsource Seniormester
05. december 2008 - 14:34 #4
Dit php script som henter/viser fra DB skal jo også være gemt som utf-8, for at der ikke går ged i den.
Avatar billede htx98i17 Professor
05. december 2008 - 14:39 #5
showsource: det sql eksempel ændrer så vidt jeg har fundet ud af, ikke allerede indsat data. Kun nye indsættelser?
Avatar billede showsource Seniormester
05. december 2008 - 14:51 #6
Well, der er jeg så godt nok på bar bund, for umiddelbart i min lille verden, er det blot et spm. om "sortering", d.v.s. hvad du gemmer og allerede har gemt, vil være det samme.

F.eks. "Rødgrød med fløde" vil være det samme i tabellen, både før og efter.
Avatar billede htx98i17 Professor
05. december 2008 - 15:04 #7
Problemet er at hvis jeg vil udskrive den variabel med værdien "Rødgrød med fløde" som har et ISO tegnsæt og der i html'en er defineret UTF-8, så vil bogstavet Ø blive ulæseligt. Derfor er jeg nødt til at ændre tegnsættet for værdierne i tabellerne til UTF-8.

Er det ikke korrekt? kan nogen nogle fif'er?
Avatar billede erikjacobsen Ekspert
05. december 2008 - 15:12 #8
Der er ingen smarte kommandoer, der pludselig ændrer indholdet i alle felter i alle tabeller i databasen. Du kan ved læsning, fx i PHP, ændre tegnsættet. Men ellers er anbefalingen at holde sig til samme tegnsæt hele vejen.
Avatar billede htx98i17 Professor
05. december 2008 - 15:29 #9
tak for kommentarer

Der er godt nok mange forskellige begreber at hitte ud af: encoding, codepage, unicode, ascii. Det er svært nogle gange at finde rundt i når man begynder at læse på nettet om emnet.
Er "unicode" det samme som UTF-8 ?
Avatar billede pidgeot Nybegynder
05. december 2008 - 17:07 #10
Nej. Unicode er en standard der har til hensigt at kunne udtrykke og behandle alle verdens skriftsystemer på en sammenhængende måde. Unicode-standarden tildeler bl.a. værdier til hvert enkelt muligt tegn - p.t. er der ca. 100.000 tegn i Unicode.

UTF-8 er en encoding (tegnsæt) som kan bruges til dette formål. Af andre encodings kan nævnes UTF-16 og UTF-32, der normalt bruger hhv. 2 og 4 bytes per tegn (UTF-16 bruger faktisk 4 byte til visse tegn, men disse forekommer sjældent).

UTF-8 har den fordel at den kan nøjes med en enkelt byte til bl.a. a-z, 0-9 (samt visse specialtegn - mere præcist, kræves 1 byte til alle tegn med en værdi under 128) - der kræves kun flere bytes til ting som andre skriftsystemer og tegn med accenter. Samtidigt er den velegnet til brug med systemer der ikke understøtter Unicode: fordi UTF-16 og UTF-32 begge bruger flere bytes, vil der eks. være en masse 0-bytes i sådan noget som eks. kildekode (der primært bruger engelsk som sprog til kommandoer m.v.). Det er der mange systemer der har det mindre godt med, men problemet undgås med UTF-8, fordi tegnene gemmes på samme måde.
Avatar billede pidgeot Nybegynder
05. december 2008 - 17:09 #11
Mht. at konvertere de eksisterende data, så kan du eksportere dem, ændre CREATE TABLE-sætninger så de bruger UTF-8, gemme dit SQL-script som UTF-8, og så importere det igen.

Collation angiver kun sorteringsrækkefølge - CHARACTER SET skal også sættes for at du er sikker på tabellen kan gemme dataene korrekt (dermed ikke sagt at du ikke skal bruge en passende collation, men det er ikke den del der forhindrer dig i at gemme og hente Unicode fra databasen).
Avatar billede htx98i17 Professor
05. december 2008 - 19:23 #12
pidgeot -> det var en god løsning det med at eksportere, ændre definitionen af tegnsæt til utf-8 og gemme sql-filen i utf-8. God løsning. Det giver point til dig. Du skal blot ligge et svar i det rigtige spm http://www.eksperten.dk/spm/855404
Avatar billede htx98i17 Professor
05. december 2008 - 19:26 #13
Du kan også ligge et svar her da du også har svaret på dette spm.

Men har jeg forstået rigtigt at man bruger SET NAMES utf8 for at fortælle mysql at i denne connection skal alle vædier indsættes i tabellen med formatet utf8 ?
Avatar billede pidgeot Nybegynder
05. december 2008 - 20:09 #14
Nej, SET NAMES angiver intet om tegnsæt der bruges til indsættelse - for det afhænger af tegnsættet der bruges til tabellen. Forbindelsen kan godt bruge et andet tegnsæt, i hvilket tilfælde MySQL skulle konvertere fra det ene til det andet. I praksis vil man dog nok sørge for at de bruger det samme tegnsæt - for ellers kan man jo ikke læse alt det man har gemt (eller omvendt, man kan ikke gemme alt det man sender ind).

Den nye PHP-funktion gør sandsynligvis noget af det samme - jeg har dog ikke kigget nærmere på den, så det kan være den er mere avanceret på den ene eller den anden måde.
Avatar billede htx98i17 Professor
05. december 2008 - 20:12 #15
tak for deltagelsen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester