Autor Zpráva
Vorel
Profil *
Jaký datový typ je nejvhodnější použít pro řetězec?
Není nejlepší použít datový typ TEXT?
Nebo podle čeho se řídit při výběru konkrétního typu (TEXT,CHAR,VARCHAR,NCHAR,...)?
juriad
Profil
CHAR = pevně dlouhý text; zabírá vždy přesně takové místo, je rychlý; vhodný je pro máloznakové texty (ANO/NE, Y/N)
VARCHAR = text s proměnlivou délkou; má horní limit, je rychlý při zpracování (je uložen přímo v řádku tabulky, lze ho indexovat); hodí se na většinu textů u kterých můžeš garantovat jejich maximální velikost (jména, titulky, typy)
TEXT = skoro neomezený text; je umožen mimo řádek tabulky, takže práce s ním je pomalejší. Hodí se třeba na texty článků, záznamy logů atp.

N*** = varianta předchozích, které mohou obsahovat libovolný znak z Unicode na úkor velikosti. Obyčejné (ty nezačínající na N) mohou obsahovat jen znaky v takovém kódování, které uvedeš při jejich definici.

Toliko obecně. SQLite je ale speciální databáze, ta má jediný ultimátní řetězcový typ. V SQLite tedy typy moc řešit nemusíš.
TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
http://www.sqlite.org/datatype3.html
Je to z důvodu jednoduchosti; SQLite není určena do prostředí, které vyžaduje vysoký výkon.
Vorel
Profil *
OK.
Takže, když budu ukládat záznam např. o délce 0-30 znaků použiji VARCHAR a musím u tohoto typu definovat max. délku (tzn.Size=30)?
juriad
Profil
Speciálně u SQLite ti stačí uvést jen jeden z INTEGER (celé číslo), REAL (desetinné číslo), TEXT (text), BLOB (binární data).

Ať uvedeš kterýkoli z:
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
vždy to bude SQLite považovat za TEXT. Nijak neomezí ani velikost vložených záznamů, navíc všechno bude ukládat v Unicode.
Vorel
Profil *
Aha,
VARCHAR tedy použiju např. pro jména, emaily, adresy, atd...
TEXT pro články, zprávy, atd...
s dalším se nemá cenu zaobírat a udávat max. délku je také zbytečné. Je to tak?
juriad
Profil
Znovu. U SQLite se tím vůbec nemá smysl zabývat. SQLite má jediný řetězcový typ TEXT. Dovolí ti sice zapsat i jiné výše zmíněné, ale mají stejný význam, jako by to byl TEXT.

Ano, pro jiné databáze než SQLite jsi příklady uvedl dobře.
U těch databází záleží na délce, kterou uvedeš.
Délka u CHAR - značí počet použitých znaků. Pokud vložíš více, doplní se zprava mezerami (záleží na databázi, alespoň myslím). Pokud vložíš více, text se ořízne.
Délka u VARCHAT - značí maximální počet znaků. Pokud vložíš méně, nic se neděje. Pokud vložíš více, text se ořízne.
Délka u TEXT - je irelevantní, neuvádí se. Databáze může nabídnout různé rozsahy TEXTů jako samotné typy: LONG TEXT, SHORT TEXT atp.

VARCHAR a TEXT zaberou přesně místo odpovídající počtu znaků + pár bytů na uložení použité délky.
CHAR zabere vždy celé vyhrazené místo, nepotřebuje ukládat použitou délku.
Varianty s N nazačátku zaberou přibližně dvakrát více místa, záleží však na databázi, jak ukládá Unicode.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: