Kódolás problémák mysql 4-es verzió

Ha kérdőjelek jelennek meg a bázis, majd miután a szerverhez való csatlakozáshoz, hogy végre egy mágikus lekérdezés:

set nevű kódoló

A „kód” meg kell egyeznie a kódolást, ami megjeleníti az oldalt az oldalon. Például:

Ha ez nem működik, és még mindig vannak kérdőjelek vagy „hoppá, szemét” vagy megjelenített finom, de válogatás sánta, így ferdén szabott kódolási táblázatokat. Ebben az esetben lásd: „kijavítása az adatbázis táblákat, ahol a rossz kódolás van megadva.”

Megjegyzés: ahelyett, hogy a SET NEVEK lekérdezés, amennyiben lehetséges, hogy használja mysql_set_charset () függvényt.

részletes magyarázatot

Előtt 4.1 verzió kódolási adatokat a MySQL egyetlen egyáltalán lehet beállítani. Elméletileg semmi akadálya egy táblázatban tárolja az adatokat Unicode, és a többi - a KOI-8. És ez így érkezett: a végén, hogy az adatbázis, minden olyan adatot - ez csak egy számsor. Hogy fogalmazva, ez az Ön számára, és vissza fog térni. De a helyes keresési és rendezési csak akkor működik, az adatok, amelyeket kódolt egybeesik MySQL beállításokat.

Kezdve 4.1-es verziója, lehetővé vált, hogy tárolja az adatokat semmilyen kódolást, és meg kell határozni a rendezés a legalább minden területen a táblázatban. De ennek így kellett bevezetni néhány szabályt.
  1. Minden mező táblázatban két paramétert vezettek be: a kódolás (karakterkészlet), és az összehasonlítást szabály (COLLATION). Kódolás - mondjuk alapul, amit kódoló vannak adataink. összehasonlítjuk a szabályok meghatározzák a rendezési és az adatok összehasonlítása a keresést. COLLATION mereven csatlakozik a karakterkészletet-in, és csak akkor végezhető el a támogatott kódolási. Egyszerűen fogalmazva, a kezdődő COLLATION nevének meg kell egyeznie a megadott karaktersorozatot. Például a kódoláshoz utf8 megadhatja egybevetés utf8_bin, de nem cp1251_bin.

Jellemzően minden egyes kódoló legalább két megfelelő szabályok - imyakodirovki_bin és imyakodirovki_general_ci. Az első összehasonlítja a homlok a karakter kódok, és a második - insensitively, adott azonos szimbólumokat. COLLATION imyakodirovki_general_cs le-és nagybetűk, ellentétben _bin amely lehetővé teszi a megfelelő szimbólumokat ( „e” és „e” oroszul), valamint a válogatás, vezessenek azokat a karaktereket, amelyek kódolt, nem fontossági sorrendben (pl „e „1251-ben).

Ha a mező nincs megadva COLLATION, úgy ez az alapértelmezés. Például, az utf8 - utf8_general_ci. A legtöbb esetben COLLATION felhasználó rendezi az alapértelmezett, ami azt jelenti, hogy nem kell kérni. Ez azt jelenti, elegendő a kódoláshoz.

A kódolás lehet meghatározni a területen, asztal, adatbázis és a szerver. Létesítményekben jellegét alapértelmezett és meg lehet változtatni minden szinten. Kódolás (és válogatás) megadható minden egyes területen. Ha ők nem létrehozásakor megadott asztalt vett megadott kódolású az asztalra. Amikor létrehoz egy táblázatot kódolás nincs megadva, akkor ki kell venni a beállításokat tárol. Hasonlóképpen, ha egy adatbázis létrehozása - vagy egyértelműen meghatározott, vagy vett szerver beállításokat.
  • Szükség van, hogy mondjuk az adatbázisba, milyen kódolást írunk, vagy szeretné, hogy az Ön adatait. Azaz, nem volt olyan dolog, mint az ügyfél kódolást. Itt rejlik a válasz a kérdésre? Kérdőjelek „” hol „Úgy tűnik, ha a táblázat kódolás nem ugyanaz, mint a c ügyfél kódolás Ennek megfelelően, MySQL, két új parancsot: .. Állítsa character_set_client és állítsa character_set_results első meghatározza az adat megérkezik bármilyen kódolás az alap és a többi -. mi a kérdés, mivel a legtöbb ilyen kódok egyeznek, akkor írj a rövid - egy lekérdezés „neveinek beállítása kódoló”, amely meghatározza mindkét paramétert.
  • A fenti magyarázat világossá kell tenni, hogy a zavartalan működésének minden kell tennünk két dolgot:
    1. Adja meg a helyes ügyfél kódolást. Ezt meg lehet tenni akár a szerver beállításait a my.ini, illetve, hogy a lekérdezés SET NAMES.
    2. Egy táblázat, ne felejtsük el, hogy adja meg a megfelelő kódolás őket. Ezt meg lehet tenni számos módon. A legegyszerűbb -, hogy a kódolást és összehasonlítása szabályok közvetlenül a kódot CREATE TABLE. például:

    CREATE TABLE `chartest` # 40;
    `Elnevezés varchar # 40; 10 # 41; alapértelmezett NULL
    # 41; MOTOR = MyISAM CHARACTER SET = utf8

    De mi van, ha van egy hatalmas lerakó több száz asztalok, tett egy korábbi verziója MySQL? Hozzáfűzése minden asztalnál kézzel? Talán meg kell csinálni. De először is meg kell próbálni hogy az alapértelmezett beállításokat.

    Ahogy emlékszem, amikor a táblák, ha nem adja meg a charset és egybevetése, ezeket a paramétereket kell venni a konfigurációs adatbázisban. Ezért szükséges, hogy megpróbálja megváltoztatni ezeket a beállításokat. Első ránézésre, amit most bemegy konzol és írd be:

    A `mydb`
    Mutasd változók, mint a „karakter _ _ set adatbázis”;

    Ez a lekérdezés megjeleníti az alapértelmezett kódolást bázis mydb. Ha ez nem áll jól nekünk, igyekszünk, hogy felülbírálja a beállításokat magad:

    módosítja adatbázis `mydb` karakterkészlet utf8;

    Ha a kérés sikeres, akkor ellenőrizze újra, és ha minden jól megy, akkor elkezd létrehozni egy táblázatot vagy töltse egy szeméttelep. Ha így nem lehetséges (nincs elég jogok), az egyetlen két lehetőség van: vagy lépjen kapcsolatba a szolgáltató maga megváltoztatni a beállításokat, vagy építenek COLLATION és karakter készlet minden táblák létrehozásához kézzel.

    recoding

    Mint az előző magyarázatok, az ügyfélnek meg kell felelnie az aktuális kódolást a kódoló a bejövő adatokat. Ebben az esetben is, ha az adatok egy másik, akkor még nem lesz probléma - MySQL automatikusan perekodruet oda-vissza.

    Egy kísérlet. Számára, szükségünk van MySQL, telepített Windows alatt. Azok számára, akik egy másik operációs rendszer, azt hiszem, hogy változtassa meg a kódolási probléma nem lesz a terminál.

    Annak bizonyítására, a lehetőségek átalakítás használjuk azt a tényt, hogy a Windows alapértelmezett konzol beállítása a kódolás a régi DOS-os - 866. Vagyis először hozzon létre egy táblázatot e kódolási és írni rá, majd próbálja kommunikálni az adatbázist a különböző kódolás.

    Először ezt a parancsot tolmács cmd.exe, és állítsa be a betűtípus Lucida Console ablak tulajdonságait. Ezután hívja a konzol mysql:

    C: \ MySQL \ bin \ mysql.exe -uroot teszt

    A konzol write:

    set nevek cp866;
    CREATE TABLE ct # 40; `Elnevezés varchar # 40; 10 # 41; alapértelmezett NULL # 41; CHARACTER SET = cp866;
    helyezze ct értékeket # 40; 'Vova' # 41; ;
    select * from ct;

    Ha mindent helyesen, a következtetés az, hogy:

    Majd írunk kilépési, lépjen ki a konzolt és írd parancs „CHCP parancs 1251”, amely felváltja a windows konzolablakokat kódolást 1251. Aztán megint futni mysql konzol és írd be:

    meghatározott nevek cp1251;
    select * from ct;
    helyezze ct értékeket # 40; 'Vova' # 41; ;
    select * from ct;

    Ugyanezt meg lehet ismételni a utf8 kódolást (CHCP parancs 65001).

    Ennek eredményeként, azt látjuk, hogy még ha az adatok vétele a kódolás, amelyben azok az adatbázisban tárolt, velük együtt dolgozni megy teljesen korrekt. Ugyanakkor továbbra is hazugság az alapja ugyanazt a kódolást, ahol ők voltak az elején - 866.

    Konverziós lehetőségek korlátozottak, természetesen, egy és ugyanazon a nyelven. Azaz, honnan 1251 át tudja alakítani a 866 KOI8R UTF8. A latin1 származó 1251 újrakódolnia lehetetlen - lesz a kérdőjel.

    Javítás adatbázistáblát amely helytelen kódolást

    Mi van, ha a normál levelek, és a keresési és rendezési munka furcsa?

    Tehát van a problémákat, hogy nem foglalkozik kérés SET NAMES. Ez azt jelenti, hogy az adatok a táblázatok azonos kódolás megadott e táblázatok - egy másik. Elvileg egy gyors megoldás erre a problémára lehet következtetni a korábbi magyarázat: olyan kérelmet SET NAMES kódolást, ami meg van adva a táblázatban. Tekintse kérését tudja mutatni create table `table`.

    Ha van az utolsó sorban írott Alapértelmezett karakterkészlet = latin1, akkor futtasson egy lekérdezést SET NAMES latin1. A táblázat nem fog megfelelően működni válogatás és keresést, de legalább az adat önmagában is adható, és egészséges (ha a kódolás html oldal megfelel a tényleges kódolás fekvő adatbázisban). De ez természetesen nem egy normális helyzet, annál is inkább, hogy rögzítse egy pillanat alatt.

    Kijavítani kétféleképpen vehetik Ebben a megvalósításban:
    • Tudjon kódolás asztalok (mutat create table `table`).
    • Készíts egy adatbázis dump használata mysqldump
    Tegyük fel, azt találtuk, hogy a táblák létrehozva az alapértelmezett karakterkészlet latin1, de valójában adatokat tartalmaznak utf8. Ebben az esetben használjuk a következő parancsot:

    mysqldump -uUSERNAME -pPASSWORD DB_NAME --allow-kulcsszavak --create-opciók --complete-betét --default-karakterkészlet = latin1 --add-drop-asztal> dump.sql

    Mindenütt elérhető hiba olyan esetekben, amikor --default karakteres beállított jelzi az aktuális kódolást az adatok, ebben az esetben - utf8. A lerakó szemetet. Meg kell jelölni az egyik, hogy van beállítva a táblázatokban. Ennek eredményeként a MySQL nem próbálja meg újra kódolják az adatokat, és így, ahogy van.

    Fájlok megtekintése a lerakó, hogy megbizonyosodjon arról, hogy a rendes fájl adatait az utf8 kódolás helyett szemetet. Egész és valós billenő másolat félre. Távol az oldalon.

    A dump fájl kijavítani a CREATE DATABASE nyilatkozatot, és / vagy a CREATE TABLE létrehozni egy táblázatot a megfelelő kódolást. Vagy változtatni az adatbázis-konfigurációs, a fent leírtak szerint. Töltsük billenő vissza:

    mysql -uUSERNAME -pPASSWORD DB_NAME --default karakteres-set = utf8

    A telek kódot, miután a függvény mysql_connect mysql_select_db és add hozzá a következő sort:

    mysql_query # 40; "SET NAMES utf8" # 41; ;

    Minden tud dolgozni!

    Ha még mindig nem működik
    Számos kérdésre kódolást, amelyek nem kapcsolódnak az adatbázishoz, arra késztetett, hogy egy kis összefoglaló kalauz. Így a kódolási oldalunk áll 4 tételek:
    1. adatbázis kódolás. Létrehozásakor megadott táblázatokat. Ez lehet bármilyen. Meg kell tükrözi a valós adatokat a kódolási táblázatban. Például, ha az adatokat mi lesz a Windows 1251, majd hozzon létre egy táblázatot, az írás:

    CREATE TABLE chartest # 40; karakterlánc szövegben # 41; DEFAULT CHARSET = cp1251;

    Ellenőrizze az aktuális karakter tábla kérheti

    SHOW CREATE TABLE táblanév

  • DB ügyfélszolgálat (ügyfél itt van a script fut az adatbázis). Beállítása után azonnal kapcsolatot az adatbázis lekérdezés

    SET NAMES kódoló

    Egybe kell esnie a kódoló kimeneti oldalak HTML. Például, ha egy oldalt a utf-8, akkor írj a PHP

    mysql_query # 40; "SET NAMES utf8" # 41; ;

    Meg tudja nézni kérés

    azt mutatják, változók, mint a '% char%'; # 40; character_set_client változókat. character_set_connection character_set_results és bizonyára a beállított érték számunkra # 41;

  • Kódolás oldalon. Beállítja a HTTP fejléc Content-type. Meg kell felelnie a kódolt adatokat az oldalon. Például, ha egy oldalt a utf-8, a PHP write:

    header # 40; "Content-Type: text / html; charset = UTF-8" # 41; ;

    jegyzetek
    • Vicces, de a kérelmet SET NEVEK nem változik a karakterkódolást használja a mysql_real_escape_string. És csak a kódolás, ez a funkció találták! Hogy mysql_real_escape_string dolgoztam célja, és hogy meg kell változtatni a kódolást pomschyu mysql_set_charset (), ahelyett, hogy a lekérdezés SET NAMES. Azonban ez nem olyan fontos számunkra, mert uta8 és minden egyetlen bájtos karakterkészletek nincs káros hatása a rossz kódolás nem. Nem beszélve arról, hogy itt az ideje, hogy hagyjon prosleshivaniya általános és használja a natív elkészített nyilatkozatokat.
    • Ha nem szeretné, hogy az egyes szkript a kódolást, akkor a kódolás az összes alapértelmezett szervert. Ebből a célból a my.ini [mysqld] szakasz kell írni:

    init-connect = 'SET NAMES utf8'

    Így van alapértelmezett kódolás lesz változott latin1 a megadott. Természetesen a script lehet változtatni, hogy minden más.