Kom ihåg mig?
Home Menu

Menu


Databas med MySQL, men med ISO som output?

 
Ämnesverktyg Visningsalternativ
Oläst 2008-12-11, 22:50 #11
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
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?
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-11, 22:58 #12
Onkelborg Onkelborg är inte uppkopplad
Flitig postare
 
Reg.datum: Feb 2007
Inlägg: 382
Onkelborg Onkelborg är inte uppkopplad
Flitig postare
 
Reg.datum: Feb 2007
Inlägg: 382
Vad skriver du i för språk? asp.net? (vb.net eller c# isf?) Leta efter charset eller liknande på response-objektet
Onkelborg är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-11, 22:59 #13
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
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Ã¥")
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-11, 23:00 #14
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Använder som sagt klassisk asp (tyvärr, mycket jobb att koda om allting)
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 10:11 #15
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
Citat:
Originally posted by Lindahl@Dec 11 2008, 23:59
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Ã¥)

Det var som jag befarade. Dit innehåll i databaserna är det inget fel på, Mysql lagrar bara tecken och tar fram dem igen och det fungerar på din burk.
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 10:42 #16
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
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.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 11:07 #17
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
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:
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).
Innebär detta att jag fortsättningsvis alltid måste köra med set names utf8 före jag gör en databasfråga, eller går det ändra så att det alltid är standard?
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 11:13 #18
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 Lindahl@Dec 12 2008, 12:07
Innebär detta att jag fortsättningsvis alltid måste köra med set names utf8 före jag gör en databasfråga, eller går det ändra så att det alltid är standard?
Säkrast är att alltid SET NAMES vid varje uppkoppling (inte före varje fråga).
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 11:45 #19
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
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-12, 12:16 #20
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, 12:45
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.
Genvägar? Omvägar menar du? (Förresten gjorde du en utmärkt analys av vad problemet var så jag hoppas att du inte bara tycker jag gnäller.)

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:
If you want to change the table default character set and all character columns (CHAR, VARCHAR, TEXT) to a new character set, use a statement like this:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
For a column that has a data type of VARCHAR or one of the TEXT types, CONVERT TO CHARACTER SET will change the data type as necessary to ensure that the new column is long enough to store as many characters as the original column. For example, a TEXT column has two length bytes, which store the byte-length of values in the column, up to a maximum of 65,535. For a latin1 TEXT column, each character requires a single byte, so the column can store up to 65,535 characters. If the column is converted to utf8, each character might require up to 3 bytes, for a maximum possible length of 3 × 65,535 = 196,605 bytes. That length will not fit in a TEXT column's length bytes, so MySQL will convert the data type to MEDIUMTEXT, which is the smallest string type for which the length bytes can record a value of 196,605. Similarly, a VARCHAR column might be converted to MEDIUMTEXT.

To avoid data type changes of the type just described, do not use CONVERT TO CHARACTER SET. Instead, use MODIFY to change individual columns. For example:

ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8;
If you specify CONVERT TO CHARACTER SET binary, the CHAR, VARCHAR, and TEXT columns are converted to their corresponding binary string types (BINARY, VARBINARY, BLOB). This means that the columns no longer will have a character set and a subsequent CONVERT TO operation will not apply to them.

If charset_name is DEFAULT, the database character set is used.

Warning
The CONVERT TO operation converts column values between the character sets. This is not what you want if you have a column in one character set (like latin1) but the stored values actually use some other, incompatible character set (like utf8). In this case, you have to do the following for each such column:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
The reason this works is that there is no conversion when you convert to or from BLOB columns.

To change only the default character set for a table, use this statement:

ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
The word DEFAULT is optional. The default character set is the character set that is used if you do not specify the character set for columns that you add to a table later (for example, with ALTER TABLE ... ADD column).
Tyvärr har jag ingen tabell som jag kan testa på just nu och orkar inte heller göra en test. Men det ska inte vara särskilt svårt (det brukar vara steget med BINARY som de flesta missar). Jag hoppas glädjen infinner sig…

Edit: Relevant mening i dokumentationen nu röd.
martine är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 03:37.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017