Pereiti prie turinio

Svetainės ir MySQL duomenų bazės charset.


Rekomenduojami pranešimai

Sveiki, svetainė naudoja UTF-8

<meta charset="utf-8">

 

Kadangi UTF-8 dažnai rekomenduojamas, nusprendžiau naudot jį visur: tiek duomenų bazėje tiek svetainėje. Bet žinoma iš kilo problemų dėl lietuviškų rašmenų.

 

Duomenų bazėje, iš lietuviškų raidžių rodoma tik "š", kitos pakeistos į klaustukus. Jungiantis į duomenų bazę, taip pat nustatau charset į UTF-8:

new PDO('mysql:host=localhost;dbname=db;charset=utf8',"lol","yo");

 

Kokį charset reikėtų naudoti kad būtų kuo mažiau problemų? Ar aš tiesiog kažką praleidau?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, svetainė naudoja UTF-8

<meta charset="utf-8">

 

Kadangi UTF-8 dažnai rekomenduojamas, nusprendžiau naudot jį visur: tiek duomenų bazėje tiek svetainėje. Bet žinoma iš kilo problemų dėl lietuviškų rašmenų.

 

Duomenų bazėje, iš lietuviškų raidžių rodoma tik "š", kitos pakeistos į klaustukus. Jungiantis į duomenų bazę, taip pat nustatau charset į UTF-8:

new PDO('mysql:host=localhost;dbname=db;charset=utf8',"lol","yo");

 

Kokį charset reikėtų naudoti kad būtų kuo mažiau problemų? Ar aš tiesiog kažką praleidau?

 

duomenų bazėj lauko "xx" žiūrėk koks encoding (colation ar kaip ten vadinas mysql, nepamenu)

Redagavo petrask
Nuoroda į pranešimą
Dalintis kituose puslapiuose

UTF8_lithuanian_ci. Paprasto UTF8 neradau. Ką tik išbandžiau ir "UTF8_bin", jokio pokyčio.

 

utf8-general-ci nėra?

 

public function __construct(){

       // Set DSN
       $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
       // Set options
       $options = array(
           PDO::ATTR_PERSISTENT    => true,
           PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION,
           PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
       );

       // Create a new PDO instanace
       try{
             $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
       }
       // Catch any errors
       catch(PDOException $e){
           $this->error = $e->getMessage();
       }
   }

Redagavo BigBug
Nuoroda į pranešimą
Dalintis kituose puslapiuose

utf8-general-ci nėra?

 

public function __construct(){

       // Set DSN
       $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
       // Set options
       $options = array(
           PDO::ATTR_PERSISTENT    => true,
           PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION,
           PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
       );

       // Create a new PDO instanace
       try{
             $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
       }
       // Catch any errors
       catch(PDOException $e){
           $this->error = $e->getMessage();
       }
   }

 

Hmm, ankščiau jo nepastebėjau. Bet jis irgi nieko nepakeitė.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Taip, "UTF8 with BOM", nesu tikras kas tas BOM.

 

 

Mesk velniop tą BOM, naudos jokios, tik ateityje gali kilti problemų, pvz., gali gauti „headers already sent“, kai nustatinėsi headerius.

 

 

Red: jeigu įdomu kas tai yra: tavo kompiuteris (assuminu Intel architekūrą) saugo žòdžius (a.k.a. 2 baitus) „atvirkščiai“. Jeigu sakai, kad į ramą įdėtų 1234, tai įdės 3412. Šita sąvybė vadinama little-endian. Tinkle yra priimta naudoti big-endian, t.y., „normalų“. Taigi, BOM (byte order mark) nurodo kuris variantas naudojamas faile. Šiais laikais, tai yra gana useless dalykas, keliantis tik problemas, nes networkas (ir kitos architektūros pvz., ARM esantis tavo telefone) naudoja big-endian.

 

Refs:

http://en.wikipedia.org/wiki/Endianness

http://en.wikipedia.org/wiki/Byte_order_mark

Redagavo kashiukas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Šiais laikais, tai yra gana useless dalykas, keliantis tik problemas, nes networkas (ir kitos architektūros pvz., ARM esantis tavo telefone) naudoja big-endian.

O x86 / x86_64 procesoriai naudoja little endian :). T.y., jei atmintyje turėsi 0xA1A2A3A4, tai jis bus išdėliotas A4 A3 A2 A1. Taip ir įsiminiau: [x86] procesoriai maži, todėl naudoja little endian, žmonės dideli, todėl mums natūralesnis atrodo big endian.

 

Taigi, nėra taip, kad visur būtų vienas endianness. BOM nereikalingas būtent UTF-8, nes jis visada yra big-endian (berods). O štai UTF-16 jau gali būti big arba little :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Taigi, nėra taip, kad visur būtų vienas endianness.

 

 

Aš šito ir nesakiau. ;-)

 

 

Jeigu UTF-16 nėra BOM'o yra assuminamas big-endian kas yra gerai. Little-endian failai, mano supratimu, reikalingi nebent siekiant didelio performanso dumpinant atmintį. Galbūt gali pataisyti, jei klystu? :-)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš šito ir nesakiau. ;-)

 

 

Jeigu UTF-16 nėra BOM'o yra assuminamas big-endian kas yra gerai. Little-endian failai, mano supratimu, reikalingi nebent siekiant didelio performanso dumpinant atmintį. Galbūt gali pataisyti, jei klystu? :-)

Iš tikrųjų nežinau (neatsimenu), kokie privalumai yra vieno ar kito endianness. Nesiruošiu savo noru naudoti kažko kito, nei UTF-8 :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...