Kódok és karakterláncok a mysql-ben - cikkek

Orosz nyelvű kódolások

Hagyományosan négy kódolást használtak Oroszországban az orosz karakterek megjelenítéséhez:

Ez a négy kódolás közös tulajdonságokkal és különbségekkel rendelkezik. Először is, mindegyikük egy bájtnyi információt tárol egy karakter tárolásához. Másodszor, kompatibilisek a latin1 kódolással, azaz ugyanakkora 128 bájtja van a kódolási táblázatnak. A felső bitkészlet (vagyis a 128-255-ös értékek) értékei különböznek egymástól.

Nagyon sok a négy karakteres kódolás egy nyelv számára. Kezdetben az emberek nem tulajdonított semmilyen jelentőséget ennek, de az utóbbi években ez nem így van. Különböző problémák voltak a hordozhatósági programok terén, és az emberek úgy döntöttek, hogy olyan általános kódolást hoznak létre, amely tartalmazza a világ összes nyelvének szimbólumát (beleértve természetesen az orosz nyelvet is).

Így létrejött az Unicode kódolás (UCS-2). Természetesen nem lehet nagyon nagy számú karaktert elhelyezni 8 bitben, így ez a kódolás 2 bájtot (azaz 16 bitet) tartalmaz minden karakterhez. A kódolás sorai természetesen több helyet foglalnak el, mint a régi kódolásnál, de az ilyen karakterláncokat használó alkalmazások nagyon könnyen átvihetők más nyelvekre.

Az UCS-2 bevezetése ellenére még mindig vannak problémák. Először is, ez a hossza hosszának meghatározott növekedése. Azok a személyek, akik csak latin karaktereket használtak, nem értették meg maguknak, hogy miért használják a 16 bitet, hogy olyan karaktereket jelöljenek, amelyek 7 bitre illeszkednek. Másodszor, 65 536 karakter még mindig nem elegendő a bolygón használt szimbólumok jelzésére.

E nehézségek leküzdése érdekében az UTF-8 karakter változó hosszúságú kódolása jött létre. Ebben a kódolásban 1 bájtot használunk az első 128 karakter (azaz a latin1-ben szereplő karakterek) jelölésére. Ha az első bájt felső bitje be van állítva, akkor a második bájtot használják (vagyis az orosz betűk ebben a kódolásban 2 bájtot foglalnak el). Ha a második bájt felső bitje be van állítva, akkor a harmadik bájtot használjuk (és különböző hieroglifákat és más keleti szimbólumokat tartalmaz) stb.

Ez a kódolás először tetszőleges számú karaktert képes befogadni (mert lehetővé teszi dinamikusan növelve a byte-ok számát). Másodszor, angolul 1 bájtot használunk, és ez nagyon szép az angol nyelvű országokban. A keleti országok nem nagyon szeretik ezt a kódolást, mert 3 bájtot kell használniuk saját karakterük feltüntetéséhez (UCS-2-ben csak kettőt használnak).

Karakterleképezések

Néhány alkalmazás (beleértve a MySQL-t is, amelyet később tárgyalunk) nemcsak a karakterkódolásokat, hanem a karakterek leképezését is használják. Az a tény, hogy egyes szimbólumok bizonyos szimbólumokat azonosnak tekintenek (és néha egy szimbólumot vagy szimbólumsorozatot feltételeznek). Például a "ü" német nyelven írható: "ue". Másrészt svédül ugyanaz a szimbólum írható "uy" -ként.

Például oroszul, ugyanazokat az "e" és "e" betűket tekintheti meg (ahogyan gyakran a hivatalos dokumentumokban szerepelnek). Az is gyakran hasznos, hogy ne különböztessük meg a nagy és kis betűket (amelyek kódja bármilyen más kóddal rendelkezik).

A leképezés pontosan befolyásolja, hogy az alkalmazás hogyan működik a karakterek gyűjteményével, ez befolyásolja a sorrendet és a szimbólumok összehasonlítását. Természetesen a leképezés a karakterkódolástól függ.

Karakterkódolás a MySQL-ben

A MySQL kiszolgálón minden vonalnak saját kódolása és illesztése van. Táblázat létrehozásakor meghatározhatja a kódolás és leképezést, amelyben a táblázatban lévő sorok mentésre kerülnek. Ezeket a paramétereket a táblázat minden egyes mezőjéhez is megadhatja. Például:

CREATE TABLE enctest (
str1 CHAR (10) CHARSET koi8r,
str2 CHAR (15) COLLATE utf8_general_ci
);

Ebben a példában két mezőt tartalmazó tábla jön létre, amelyek közül az egyik a KOI8-R kódolásban (és az alapértelmezett leképezéssel együtt) tárolódik. A második mezőnek van egy leképezése utf8_general_ci és UTF-8 kódolása (a kódolást az illesztés határozza meg, mert a leképezés attól függ).

Az elérhető kódolások és összehasonlítások listája a parancsokkal érhető el

MUTASSA A KARAKTER SET-ot;
MUTASSA A KOLLEKCIÓT;

Az alapértelmezett kódolás és a MySQL-ben kódolt karakterlánc módosítása

Ha nem szeretné kifejezetten megadni a táblázat sorainak karakterkódolását, megadhatja az alapértelmezett karakterkódolást ezen a táblázatban:

CREATE TABLE enctest2 (
str1 CHAR (10),
str2 CHAR (15)
) DEFAULT CHARSET cp1251;

Ebben az esetben mindkét vonalat a CP1251 kódolás során hozza létre. Meghatározhatja az egyes sorok kódolását, és megadhatja az alapértelmezett kódolást.

Módosíthatja a karakterkódolást egy adott táblaterületre vonatkozóan is:

ALTER TABELA enctest2 MODIFY str1 CHAR (10) CHARSET utf8;

Ebben az esetben a str1 mezőben a kódolás megváltozik, és az összes vonal átíródik. Vegye figyelembe, hogy ha módosítja az alapértelmezett kódolást egy táblázathoz, akkor a benne lévő sorok nem recodálódnak, akkor csak a táblázatban szereplő más mezők létrehozását érinti.

Mappák a MySQL-ben

A MySQL-ben minden egyes kódolásnál legalább egy leképezés (és általában több). Annak érdekében, hogy megértsük, mi más, nagyon részletes nevük van.

Az egyes leképezések neve a megfelelő kódolás nevével kezdődik (például utf8_). Következő egy összehasonlítás a specifikáció (gyakran egy egyszerű összehasonlítás, általában az, hogy nem ismerte fel betű) és annak jelzése, az érzékenység (cs - a kis- és nagybetűk - érzékeny, ci - a kis- és nagybetűket - nem érzékenyek).

Külön meg kell jegyezni a bináris összehasonlításokat (bináris). Ha a sorok bináris módon illeszkednek egymáshoz, akkor nincs közöttük leképezések vagy konverziók. Az ilyen karakterláncokat a SET NAMES parancs nem fogja átalakítani (lásd alább). A bináris összehasonlítások különösen hasznosak a MySQL 3.23-ból történő áttéréskor, amely nem támogatja a kódolást, és amely azt jelzi, hogy minden táblázat latin1 kódolású (bár a táblák tartalmazhatnak adatokat, például a KOI8-R-ban).

MySQL kliens kódolás

A MySQL-kiszolgáló automatikusan módosítja a karakterláncot, amikor adatokat visz be egy táblába, és amikor adatokat visz be a táblából. Ennek során a rendszerváltozók, például a character_set_client adatokat használja. A kódolással kapcsolatos összes változó listája a parancs futtatásával érhető el

MUTASSA A VARIABLEK LIKE "char%";

A változókat egyedül is megadhatja, vagy azonnal megváltoztathatja egy nagy készleten (a legtöbb esetben szükséges):

SET NAMES koi8r;

Ha a szerver megkapja ezt a parancsot, akkor várható, hogy akkor továbbítja neki az összes sort a kódolás KOI8-R, és automatikusan konvertálja őket, hogy egy sztring jelenik meg a kódolási.

Ez akkor hasznos, ha az alapértelmezett kiszolgáló nem a kódolás, amit várnak (például KOI8-R, de a megjeleníteni kívánt információkat a helyszínen CP1251).

Információk tárolása a MySQL-ben

A MySQL a megadott kódolásnak megfelelően tárolja az adatokat. Mivel a szerver kiosztja 1 byte minden karakter egy byte-os karakterkészletek (CHAR (10) veszi mindig 10 bájt, a VARCHAR (10) tart 1-11 byte hosszától függően a húr, 1 extra byte költenek tárolása string hosszát).

Az UCS-2 kódolásához a kiszolgáló minden karakterhez 2 bájtot oszt ki. Az UTF-8 kódolást, a kiszolgáló kiosztja eltérő számú bájt a különböző szimbólumok (összhangban kódolás) abban az esetben, VARCHAR és 3 bájt minden egyes szimbólum esetében KAR. Így UTF-8 karakter string (10) mindig elfoglalja 30 byte, és VARCHAR (10) - 1-31 bayta.Pri ezt minden esetben, ha UTF-8, a szerver nem tudja tárolni a kód 4 bájt ( ez azonban nem jelent különleges korlátozást).