Visa ett inlägg
Oläst 2008-12-12, 21:55 #22
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Citat:
Originally posted by Magnus_A@Dec 12 2008, 17:47
Det är varje fall min tolkning av vad som händer, jag tar gärna emot förslag på förbättringar
Att vi bara orkar! :lol: Detta börjar bli lite utdraget (typiskt att man alltid låter dra sig in i sånt här…)

Okej. Som förtydligande och bevis på att det fungerar gjorde jag lite knappande och kommenterade det hela:
Kod:
CREATE TABLE t (f TEXT CHARSET latin1);
SET NAMES 'latin1';
INSERT INTO t VALUES ("åsa");
SET NAMES 'utf8';
SELECT * FROM t;

-- Ger åsa visat som utf-8, ger Ã¥sa visat som iso-8859-1
-- Den "dubbla" konverteringen sker med SET NAMES och ligger inte i databasen

DROP TABLE t;
CREATE TABLE t (f TEXT CHARSET latin1);
SET NAMES 'latin1';
INSERT INTO t VALUES ("åsa");
ALTER TABLE t MODIFY f BLOB;
ALTER TABLE t MODIFY f TEXT CHARACTER SET utf8;
SET NAMES 'utf8';
SELECT * FROM t;

-- åtger korrekt åsa visat som utf-8, ger Ã¥sa visat som iso-8859-1
-- (dvs är korrekt om filen tolkas som utf-8)

-- Samma sak med fältet som BLOB och konverteringen inte inlagd i databasen, bra för testning innan
DROP TABLE t;
CREATE TABLE t (f TEXT CHARSET latin1);
SET NAMES 'latin1';
INSERT INTO t VALUES ("åsa");
ALTER TABLE t MODIFY f BLOB;
SET NAMES 'utf8';
SELECT CONVERT(f USING utf8) FROM t;

-- Vad vi vill åstadkomma:
DROP TABLE t;
CREATE TABLE t (f TEXT CHARSET latin1);
SET NAMES 'latin1';
INSERT INTO t VALUES ("åsa");
ALTER TABLE t MODIFY f BLOB;
ALTER TABLE t MODIFY f TEXT CHARACTER SET utf8;
-- Tabellen är ändrad som ovan allt borde fungera.

-- Innan vi nu SELECT:ar så sätter NAMES till latin1 för vi vill ha ut data i iso-teckenkodning:
SET NAMES 'latin1';
SELECT * FROM t;
-- Ger Xsa (X ogiltigt unicodetecken) visat som utf-8, ger åsa visat som iso-8859-1
(Notera att de tre-fyra första raderna i exemplen bara raderar testtabellen och sedan återskapar den enligt "stoppa in uft-8 i latin1-fält"-metoden. All input var utf-8.)

Aningen oöversiktiligt men i grunden rätt enkelt:

1. Har man en tabell som egentligen är i utf8 men är deklarerad som latin1 i tabellen (gammalt rävknep för att spara utf8-data i databaser som bara kan hantera iso) så beböver man konvertera fälten enligt följande enkla kommando för varje fält (MySQL tillåter för övrigt att ändra flera kolumner i en tabell med en ALTER-sats):
Kod:
ALTER TABLE exempelfält MODIFY f BLOB;
ALTER TABLE t MODIFY exempelfält TEXT CHARACTER SET utf8;
I fall det handlar om en VARCHAR/ENUM/SET istället för TEXT så anpassas frågan för detta.

2. För att det sedan inte ska bli fel när man hämtar data så är det viktigt att man även sätter överföringsteckenkodningen (vilken är det teckensnitt man deklarerat på t.ex. hemsidan, i normalfallet utf-8) antingen i sin .ini-fil eller med sql:
Kod:
SET NAMES 'utf8'
3. För att lösa Lindahls ursprungliga problem behöver han alltså först göra ovan så att fälten är korrekt deklarerade och sedan bara använda:
Kod:
SET NAMES 'latin1';
följt av select-frågan för att få ut sin feed i iso-8859-1-form.
martine är inte uppkopplad   Svara med citatSvara med citat