Avatar billede nc85 Nybegynder
26. juni 2008 - 20:20 Der er 10 kommentarer

problemer med tegnsæt når jeg laver insert i db?

Hey alle...

Når jeg smider noget i min database, så bliver det smidt ind fx: tillæg til Sjæ...??

Den omdanner skandinaviske bogstaver noget til underligt hajs?
DB er utf-8 - selve sitet er også i utf-8

og når jeg jeg indsætter det i min db, så gør jeg sådan her (udpluk af scriptet):
---------------------------------------
$Doc_ID = $_REQUEST['doc_id'];
$info = $_POST['info'];
$UPDATE_INFOSQL = "INSERT INTO bandinfo (doc_id, info) VALUES ('$Doc_ID', '$info')";
Avatar billede pidgeot Nybegynder
26. juni 2008 - 20:29 #1
Jeg har oplevet at MySQL gerne ser man lige kører en SET NAMES 'utf8' inden nogle queries (også select) for at den ved man snakker UTF-8.

Uden den går den ud fra latin1 - og det giver så det der, fordi du i virkeligheden har givet den UTF-8. Du kan ikke mærke forskel, fordi databasen også tror du skal bruge det som latin1 når du henter det ud igen - men du kan se det i databasen, fordi den sådan set har betragtet det som om du ville have æ og ikke æ.

Bemærk dog at du skal have det med hele vejen igennem - og det gør at det ikke hænger sammen hvis du har eksisterende data. Så får du nemlig konverteret æ til UTF-8 - altså "dobbeltkodning". Dump i så fald din database som latin1, og indlæs den igen som UTF-8 - så skulle det være der.
Avatar billede nc85 Nybegynder
26. juni 2008 - 20:36 #2
Ok, nu smider den det korrekt i databasen, men udskriver stadig ikke korrekt..

Den udskriver det sådan her fx(dog udskriver den ting fra andre tabeller med æøå fint):
Ten Four kommer fra Sj�lland men spiller ogs� p� Fyn og i Jylland mod ekstra betaling.
Bandet medbringer eget anl�g og lys.
--------------------------------------

Jeg udskriver det sådan her:

Function RtrnPracticalInfo($Doc_ID){

    $headline = "praktisk info";

    $SQL = "SELECT * FROM bandinfo WHERE doc_id = '$Doc_ID'";
    $mq = mysql_query($SQL) or die(mysql_error());

    $count = mysql_num_rows($mq);
   
    $fetch_txt = mysql_fetch_array($mq);

    $bandinfo = $fetch_txt['info'];

    //echo $count;
    if($bandinfo != '') {
   
        echo '<div class="box">'; // Box start

        echo '<div class="redboxdarrow">';
        echo '<div class="wrapredheadline">';
        echo '<a href="java script:collapse3.slideit()">';
        echo strtoupper($headline);
        echo '</a>';
        echo '</div>';
        echo '</div>';

        echo '<div id="bandinfo_content">';
            //$fetch = mysql_fetch_assoc($mq);
            $band_txt = nl2br($fetch_txt['info']);
            echo '<div class="WrapBandContent">'.$band_txt.'</div>';
        echo '</div>';

        echo '</div>'; //End box
       
    } else {
        echo '';
    }

}
Avatar billede pidgeot Nybegynder
26. juni 2008 - 20:37 #3
Har du også kørt SET NAMES 'utf8' her? Det skal nemlig også bruges når du hiver det ud igen (beklager hvis det ikke var tydeligt nok).
Avatar billede nc85 Nybegynder
26. juni 2008 - 20:47 #4
er ikke helt med på hvad du mener præcist? Kan du give et eksempel ?
Avatar billede pidgeot Nybegynder
26. juni 2008 - 20:52 #5
Som sagt skulle du køre SET NAMES 'utf8' som en query inden du satte din tekst ind.

Den samme query skal køres inden du henter UD, fordi MySQL ellers tror du vil have latin1 output - og PHP ved jo ikke bedre, så den spytter det troligt ud, hvilket er grunden til de fejlende tegn. Derfor skal du faktisk køre den lige så snart du opretter din forbindelse - og da du sikkert har en fælles fil el. lign. til netop det formål, så du ikke kalder connect flere gange, så kan den passende køres lige så snart du har oprettet forbindelse til databasen.

Det er på grund af dette at jeg siger du skal have dumpet og genindlæst ALT i databasen for at rette op på det - ellers må du udelade SET NAMES, og leve med at du faktisk har noget forkert stående i databasen, hvilket du nok også vil opleve hvis du går i gang med at sortere på dine tekster *-)
Avatar billede nc85 Nybegynder
26. juni 2008 - 20:56 #6
Jamen det står jo helt fint nok i databasen, der står det nu med ÆØÅ, men det er når jeg henter det ud på sitet det går galt?
Avatar billede pidgeot Nybegynder
26. juni 2008 - 21:25 #7
Du lytter ikke til hvad jeg siger - æh, skriver *-)

Når du kigger i databasen sker det med det RIGTIGE tegnsæt - der ved MySQL og det der er i den anden ende (jeg går lige ud fra det er phpmyadmin, men princippet er det samme) at det skal vises og skrives som UTF-8, fordi phpmyadmin har bedt om det.

*Det gør du ikke*, fordi standardtegnsættet er latin1 og du ikke noget sted siger "Hey, jeg skal nu egentlig bruge UTF-8" . Dvs. at det MySQL sender tilbage til dig er latin1 - eller ISO-8859-1 - og det går selvfølgelig galt når PHP forsøger at udskrive det på en UTF-8 side (PHP selv ved ikke bedre, den gør jo bare hvad den får besked på).

Derfor skal SET NAMES 'utf8' køres HVER GANG du opretter forbindelse til database - for ellers er der pludselig en query der arbejder med et forkert tegnsæt. Og fordi dine eksisterende data allerede er ramt af denne fejl, skal du have rettet denne - og det gøres nemmest ved at lave et dump med et tegnsæt (latin1, fordi det er det det i virkeligheden er sat ind med), og sende det tilbage med besked om at det er utf-8 (hvilket jo var det du egentlig ville bruge). Den nøjagtige fremgangsmåde for det trin afhænger af hvordan du har adgang til din MySQL, men phpmyadmin lader dig angive tegnsæt både ved import og eksport, så du ikke skal gøre noget ved selve dit dump.
Avatar billede nc85 Nybegynder
26. juni 2008 - 21:44 #8
Ok, så er jeg med - Nu har jeg lavet et dump af min database - dog står der ikke hvilket tegnsæt osv der bliver brugt deri?

-- phpMyAdmin SQL Dump
-- version 2.11.0
-- http://www.phpmyadmin.net
--
-- Vært: mysql09.cliche.dk
-- Genereringstid: 26. 06 2008 kl. 20:43:27
-- Serverversion: 4.0.21
-- PHP-version: 4.4.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `musikkentiljeresbryllup_dk`
--

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `bandinfo`
--

CREATE TABLE IF NOT EXISTS `bandinfo` (
  `id` int(11) NOT NULL auto_increment,
  `doc_id` int(11) NOT NULL default '0',
  `info` text NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=56 ;

-------------------------------------------

Sådan ser dump ud - Når jeg vil importere det ind igen, hvor definerer jeg så at det skal være UTF-8 ? eller er det, det jeg har sat under "sprog/language" i phpmyadmin ?
Avatar billede pidgeot Nybegynder
26. juni 2008 - 22:37 #9
Uf, du har kun MySQL 4.0 - så er jeg ikke sikker på det her kommer til at fungere (så vidt jeg husker skal man op i 4.1 for at få en bedre tegnsætsunderstøttelse på tabeller, men det er muligt det ikke har praktisk betydning her). Sørg dog lige for du gemmer en backup og ved hvordan du skal genskabe det hele hvis det går galt - og test lokalt hvis du har mulighed for det (det skal så være på MySQL 4.0.21, da det er det din server kører).

PHPMyAdmin er åbenbart gået over til at bruge et specifikt tegnsæt ved eksport (det gjorde de ikke dengang jeg havde dette problem), men vi klarer det alligevel - vi skal bare finde ud af hvilket tegnsæt den har eksporteret det hele som (jeg har beskrevet hvad du skal gøre længere nede). Jeg går ud fra du har dataene efter det der, og blot har udeladt at vise noget af det - hvis ikke, skal du lige lave et nyt dump. Det er måske en god ide alligevel, så du kan bede den om at tage DROP TABLE-sætninger med (du er nødt til at slette de eksisterende tabeller helt for at gennemføre dette).

Åbn dit SQL-dump i en vilkårlig teksteditor. Start med at se om du kan finde teksten æ. Hvis du kan det, skal du åbne dumpet i en editor der understøtter UTF-8 (det ved du at den gør hvis den ikke kan finde den tekst), og gemme det med latin1/ANSI/ISO-8859-1/vesteuropæisk som tegnsæt (det er lidt forskelligt hvad de enkelte editorer kalder det).

Hvis du ikke fandt den tekst, så find din nye tekst. Der skulle gerne stå æ normalt - gem din nye tekst (den vi har indsat korrekt), skal du gemme dumpet med latin1/ANSI/ISO-8859-1/vesteuropæisk som tegnsæt. Hvis din editor IKKE understøtter forskellige tegnsæt (det gør de fleste nu i dag, også Notesblok), så skal du ikke foretage dig mere - så har den udlæst som latin1.

Grunden til denne proces er for at få "afkodet" de fejlindsatte tekster - de er i "dobbeltkodet" UTF-8 - den kodede tekst er blevet kodet igen *-)

Nu hvor du har dumpet i det format vi skal bruge, går du ind i PHPMyAdmin under Import. Vælg dit dump med Gennemse, og vælg utf8 under Tegnsæt for filen.

Der er dog lige den ene hage at det vi netop har fået sat KORREKT ind vil blive sat FORKERT ind nu. Det kan derfor være en ide at erstatte æ, ø, å, m.v. ved at copy/paste fra de steder hvor det var sat forkert ind - ellers skal du lige ind og rette dine data bagefter.

Hvis du ikke kan vælge tegnsæt når du importerer, og du endte med ikke at skulle gøre noget ved filen, så virker det næppe. I så fald skal du finde en editor der understøtter UTF-8, åbne filen der, gemme som latin1/ANSI/etc., og så prøve igen.

Hvis noget af det stadig ser forkert ud efter du har importeret, så prøv at forklare hvad du er endt med.
Avatar billede olebole Juniormester
27. juni 2008 - 02:44 #10
<ole>

iso-8859-1 har jo defacto været deprecated en del år, så utf-8 er et rigtig godt valg, hvis du vil undgå tegnproblemer. Du skal bare sørge for, alle led i kæden bruger det tegnsæt  =)

/mvh
</bole>
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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