Visa ett inlägg
Oläst 2008-12-12, 16:47 #21
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Det som hänt här är att kodningen blivit skruvad ett steg för långt. När tecknet för å i utf8 matades in i tabellen första gången, via anslutningen latin1 (set names latin1), blev det tvåbytes som bildar å tolkade som två separata tecken, vart och ett representerat av två bytes När man kallar fram det med samma anslutning altin1, så returnerar mysql två bytes som tillsammans "råkar" bilda bokstaven å.
Ändrar man sedan anslutningen till utf8 (set names utf8) så levererar mysql helt korrekt två bytes som behövs för att rendera de två tecken som tidigare bildade bokstaven å.
Vi får alltså ut fyra bytes där vi istället bara skulle haft två, dessa kombinationer bildar inga vettiga tecken och där för ser vi vad Lindahl ser :
Citat:
Intressant, med "set names utf8" blir ordet "ingå" istället "ingÃ¥",
Det är varje fall min tolkning av vad som händer, jag tar gärna emot förslag på förbättringar

för den som vill pula lite i mysql kan roa sig med följade terminalövning:
Citat:
SET NAMES latin1;
drop table people;
CREATE TABLE people ( id int(11) unsigned NOT NULL auto_increment, name varchar(64) default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO people VALUES
(1,'user_a'), (2,'user_å'),
(3,'user_ä');
select * from people;
SET NAMES utf8;
INSERT INTO people VALUES
(4,'user_a'),
(5,'user_å'),
(6,'user_ä');
select * from people;
alter table people engine=MyISAM default character set utf8;
ALTER TABLE people CHANGE name name BLOB;
ALTER TABLE people CHANGE name name varchar(64) CHARACTER SET utf8;
select * from people;
SET NAMES latin1;
select * from people;
Magnus_A är inte uppkopplad   Svara med citatSvara med citat