Autor Zpráva
Exkalibr
Profil *
Teď čtu na stackoverslow otázku: "Difference between VARCHAR and TEXT in mysql [duplicate]"

A tam se píše pro TEXT:
* fixed max size of 65535 characters (you cannot limit the max size)

Z toho to chápu tak, že ať použiju jakýkoliv řetězec např "pokus", tak v db. to má zabírat 65537 bajtů...

A pro Varchar:
* variable max size of M characters
* M needs to be between 1 and 65535

Z toho chápu, že pokud nastavím VARCHAR(40) bude pokus zabírat 40 bajtů.

Na jiné stránkce jsem dohledal:
"Do varchar/text/longtext columns in MySQL occupy full size in filesystem even for partially filled cells?"

A tam se píše:
* 'abcd' in VARCHAR(72) occupies 1+4 bytes on disk.
* 'abcd' in TINYTEXT occupies 1+4 bytes on disk.
* 'abcd' in TEXT occupies 2+4 bytes on disk.

* Takže tady se pro VARCHAR píše 5 bajtů
* A pro text 6 bajtů.

Takže to vůbec nechápu. Myslel jsem že varchar je pevná délka jak si ji nastavím a v db 20 záznamů VARCHAR(80) by tedy mělo mít 20+20*80 = 1620 bajtů.

Původně jsem se chtěl zeptat jestli je rozdíl v rychlosti s jakým mysql vybavuje dotaz na text nebo varchar, když nejde o indexovaný sloupec. Například když chci mít max. délku 20 znaků - rozhoduji se jestli použít TEXT nebo VARCHAR.
Kajman
Profil
Nepochopil jste to vůbec dobře. Ani jeden závěr není dobře. Přečtěte si to znovu a pečlivěji. Nejlépe i manuál.

dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html
dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-strings

"max size" je horní omezení, tedy že do typu text dáte maximálně 65535 znaků, ta věta neříká nic o tom, kolik to bude zabírat.

Pevnou délku má char ne varchar. Také si dejte pozor, že neplatí ve všech kódových stránkách, že jeden znak je jeden byte (proto platí poslední závěr jen u některých znakových sad).
Exkalibr
Profil *
Teď čtu o TINITEXT:

TINYTEXT: 255 characters - 255 B

The TINYTEXT data object is the smallest of the TEXT family and is built to efficiently store short information strings. This type can store up to 255 bytes (expressed as 2^8 -1) or 255 characters and requires a 1 byte overhead. This object can be used to store things like short summaries, URL links, and other shorter objects. TINYTEXT shines over VARCHAR when storing data that’s under 255 characters with an inconsistent length and no need to be used for sorting criteria.

A co mě zaujalo nejvíc je poznámka:

Using TEXT fields for select and search queries will incur performance hits because the server will call the objects individually and scan them during the query instead of paging data stored in the memory.

Tak se chci zeptat, jaký mám nechat typ u tabulky posts kam budou lidi psát komentáře...

Aktuálně mám toto:
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(10) unsigned NOT NULL auto_increment,
`poster` text NOT NULL,
`poster_id` int(10) unsigned NOT NULL default '1',
`poster_ip` text,
`message` text,
`posted` int(10) unsigned NOT NULL default '0',
`edited` int(10) unsigned default NULL,
`edited_by` text,
`topic_id` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `posts_topic_id_idx` (`topic_id`),
KEY `posts_multi_idx` (`poster_id`,`topic_id`),
KEY `posts_posted_idx` (`posted`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=149 ;


Z toho co jsem zatím četl a co si pamatuji je, že by bylo lepší dát VARCHAR pro message, poster_ip tam bude unsigned integer... poster a edited_by budu rušit úplně.

Pro tabulku s článkama mám toto:
CREATE TABLE IF NOT EXISTS `topics` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `uid` int(10) unsigned NOT NULL COMMENT 'sender id',
  `poster` varchar(15) NOT NULL default '',
  `subject` text NOT NULL,
  `desc_x` text NOT NULL,
  `article` text COMMENT 'první příspěvek do fora',
  `hide_smilies` tinyint(1) NOT NULL,
  `posted` int(10) unsigned NOT NULL default '0',
  `edited` int(10) unsigned default NULL,
  `subscr_action` int(11) NOT NULL,
  `first_post_id` int(10) unsigned default NULL,
  `last_post` int(10) unsigned NOT NULL default '0',
  `last_post_id` int(10) unsigned NOT NULL default '0',
  `last_poster` text,
  `num_views` mediumint(8) unsigned NOT NULL default '0',
  `num_replies` mediumint(8) unsigned NOT NULL default '0',
  `closed` tinyint(1) NOT NULL default '0',
  `sticky` tinyint(1) NOT NULL default '0',
  `moved_to` int(10) unsigned default NULL,
  `forum_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `topics_forum_id_idx` (`forum_id`),
  KEY `topics_moved_to_idx` (`moved_to`),
  KEY `topics_last_post_idx` (`last_post`),
  KEY `topics_first_post_id_idx` (`first_post_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;

poster příjde zrušit.
subject a desc_x bych dal TINYTEXT(255) a VARCHAR(500)

Jde mi hlavně o to, aby forum nejelo zbytečně pomalu při výpisech článků nebo postů, jelikož občas se mi to zdá na lokalhostu podivně pomalé, když aktualizuju stránku.
Keeehi
Profil
Výkonové rozdíly mezi jednotlivými datovými typy jsem nikdy řešit nemusel. Takže můžu vycházet jen z toho, co jsi sem napsal. Podle toho bys měl na sloupce nad kterými se bude vyhledávat použít varchar na ostatní můžeš text.

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:

0