![]() |
Har MySQL-databas med UTF-8 som teckenkodning. Hela webbplatsen är i UTF-8, så det funkar finfint, men nu är det så att jag behöver kunna generera en produktfeed från webbshopen, och denna ska levereras med ISO-8859-1. Tydligen klarar inte den andra parten av att avkoda en UTF-8-fil.
Klassisk asp är det som gäller. Förslag på hur lösa? Har testat följande, men den tar bara bort alla "fula" tecken istället för att byta ut dem mot de rätta. Kod:
s = Replace(s,"Ã¥","å") |
Har du testat Google med orden VB UTF8 ISO8859? Till exempel den här träffen? :rolleyes:
|
Kräver ju iofs att man har en komponent installerad på servern... Annars var tanken god.
|
Finns det ingen motsvarighet till php's utf8_decode()?
Edit: Kan ingen asp men kan inte detta vara något? http://www.example-code.com/asp/asp-charse...rt-tutorial.asp |
select convert(utf8_kolumn using latin1)
|
MySQL:s konverteringsfunktioner (som Magnus_A nämnde) är vida överlägsna de inbyddga funktionerna i de flesta skriptspråk och är enklare att implementera. Låt MySQL göra det det är bra på.
Borde för övrigt även fungera att SET NAMES latin1 istället för att konvertera varje fält i tabellen. |
Citat:
|
Detta tycker jag också verkar vara en väldigt bra lösning. Problemet är att jag inte får den att funka...
När jag kör "set names latin1" precis raden före jag kör min select så spottar den fortfarande ur sig utf8. Testade även samma kommandon i MySQL-Front som jag använder som editor, samma sak där, ingenting händer. Dock inga felmeddelanden. |
Och vad händer om du sänder set names utf8?
Kolla upp hur anslutningen ser ut, finns risk att du kört in utf8 i en tabell med names satt till latin1, då är du lika illa ute som jag var.. du kan köra in och ut och få tillbaka det du lade in men aldrig använda dig av mysqls inbyggda funktioner för kodning. |
Alla tabeller är satta med utf8, dubbelkollade nu. Fast om det var fel borde jag väl få problem på hemsidan i övrigt? Är noga att på varje html-sida lägga med charset både i headern och i meta-taggen, så jag är ganska säker på att all data i databasen har rätt teckenkodning eftersom den visas korrekt.
Backup-plan: Webhotellet stöder php och asp.net, testade php nu och använde utf8_decode-funktionen, men den ersätter bara med frågetecken... Det går inte så bra för mig... |
Den kan visas korrekt även om det är fel i förhållande till vad inställningarna är.
Blev inte klar på om du får samma resultat även om du sänder frågan set names utf8; innan? |
Vad skriver du i för språk? asp.net? (vb.net eller c# isf?) Leta efter charset eller liknande på response-objektet
|
Intressant, med "set names utf8" blir ordet "ingå" istället "ingÃ¥", kör jag latin1 blir det "ingÃ¥" (när webbläsaren är inställd på iso vill säga, ändrar jag webbläsarinställningarna till utf8 blir det "ingÃ¥")
|
Använder som sagt klassisk asp (tyvärr, mycket jobb att koda om allting)
|
Citat:
Det är bara det att i tidernas gryning lade du in utf8-material fast anslutningen var satt till latin1 (set names latin1, vilket av nån konstig anledning är/var standard i mysql). Därmed kan du aldrig få tillbaka det som läsbar text annat än om du kombinerar en anslutning i latin1 med att du i webbläsaren tolkar det som utf8. Alla andra kombinationer ger oönskade resultat. Men eftersom databaserna inte innehåller det som mysql tror att de innehåller så kan du inte använda mysql:s inbyggda funktioner för konvertering. Du måste dumpa ut innehållet, inte via mysqldump (eftersom det kommer att ge dig ingÃ¥ istället för ingå - pröva), utan genom en egen dump som bygger på frågor när du har ditt anslutning satt till latin1, Sen får du köra in allt igen fast då med ändrat anslutning till utf8. Hårt jobb men det lönar sig att ligga rätt positionerad i teckendjungeln. |
Det behöver inte alls vara så komplicerat som Magnus_A säger. Återigen låt MySQL göra det som det kan bäst.
Om fälten är i utf8 men deklarerade som latin1 så räcker: ALTER TABLE x MODIFY y [TEXT el. VARCHAR(n)] CHARACTER SET utf8 Om det måste konverteras: (verkar inte vara fallet för din del) ALTER TABLE x CONVERT TO CHARACTER SET utf8 Annars om den faktiska teckenkodningen är i någon feldeklarerad form så får du först konvertera innehållet till BINARY (då har du den råa teckenkoden som du sedan kan applicera teckenuppsättningar eller konverteringar på): ALTER TABLE x MODIFY y BLOB osv. ALTER TABLE x MODIFY y TEXT osv. CHARACTER SET utf8 Klona en tabell och prova tills du fått fram rätt tabell (glöm som alltid inte att ta en backup när du gör större förändringar i databasen). Det hela finns detaljerat beskrivet i MySQL:s dokumentation: http://dev.mysql.com/doc/refman/5.0/en/alt...lter-table.html se någonstans mitt på sidan . Jag har haft nästan hur tokiga tabeller som helst med blandat latin1, latin2, utf8 som latin1, latin2 som latin1, osv. utan att det har varit särskilt svårt att låta MySQL konvertera det hela till rätt teckenuppsättning. Den bästa vägen brukar vara att gå via BINARY. PS För att se vad du har för deklarerad teckenuppsättning så kör SHOW FULL COLUMNS FROM x, har jag för mig. |
Får bli till att experimentera lite med detta i helgen. Ska ta backuper också, blev lite nervös igår när MySQL-Front helt plötsligt tog bort innehållet i alla fält som innehöll specialtecken, men som tur var räckte det att starta om programmet, databasen var intakt (vilket vore konstigt annars, hade ju bara kört med SELECT).
Citat:
|
Citat:
|
Konvertera latin1 till utf8 går bra med martines metod, men jag har inte fått det att fungera på kolumner där jag fått in utf8 i latin1-kolumner.
Ingen skulle vara gladare än jag om jag får binary-metoden att fungera, så hjälp mig gärna att hitta rätt. Jag har dock använt för många timmar på att försöka konvertera fält och databaser utan att nå önskade resultat, så jag använder numer andra genvägar. |
Citat:
Jag kan bara bekräfta att jag ett flertal gånger har konverterat (via BINARY) utf8-kolumner som varit deklarerade som latin1 så att de blir korrekta (precis som du säger uppstår problemet på genom att MySQL innan version 5 (egentligen 4.1 för att vara exakt) inte hade något stöd för unicode vilket gjorde att man var tvungen att spara utf-8 i latin1-deklarerade kolumner). Dokumentationen för MySQL förklarar som sagt hur man gör (länkad i inlägget ovan): Citat:
Edit: Relevant mening i dokumentationen nu röd. |
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:
för den som vill pula lite i mysql kan roa sig med följade terminalövning: Citat:
|
Citat:
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); 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; 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' Kod:
SET NAMES 'latin1'; |
Alla tider är GMT +2. Klockan är nu 13:51. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson