Autor Zpráva
Smilee
Profil *
Chci použít jednu aplikaci, která při vytváření tabulky používá jako klíč pers_lastname typu varchar. Chtěl bych ale změnit v celé databázi tam kde to jde typ sloupců varchar na text, aby tabulky méně zabíraly. Je možné toto provést?

Aktuálně když dám typ TEXT tak dostanu chybu

PDO::errorInfo(): Array ( [0] => 42000 [1] => 1170 [2] => BLOB/TEXT column 'event_kind' used in key specification without a key length )

        $db_update = $dbh->query("CREATE TABLE humo_persons (
            pers_id INT(10) unsigned NOT NULL auto_increment,
            pers_gedcomnumber varchar(25) CHARACTER SET utf8,
            pers_tree_id mediumint(7),
            pers_tree_prefix varchar(10) CHARACTER SET utf8,
            pers_famc TEXT CHARACTER SET utf8,
            pers_fams TEXT CHARACTER SET utf8,
            pers_indexnr TEXT CHARACTER SET utf8,
            pers_firstname TEXT CHARACTER SET utf8,
            pers_callname TEXT CHARACTER SET utf8,
            pers_prefix varchar(20) CHARACTER SET utf8,
            pers_lastname varchar(60) CHARACTER SET utf8,
            pers_patronym TEXT CHARACTER SET utf8,
            pers_name_text TEXT CHARACTER SET utf8,
            pers_sexe varchar(1) CHARACTER SET utf8,
            pers_own_code TEXT CHARACTER SET utf8,
        pers_birth_place TEXT CHARACTER SET utf8,
        pers_birth_date DATE ,
        pers_birth_time TIME ,
        pers_birth_text TEXT CHARACTER SET utf8,
        pers_stillborn varchar(1) CHARACTER SET utf8 DEFAULT 'n',
        pers_bapt_place TEXT CHARACTER SET utf8,
        pers_bapt_date DATE ,
        pers_bapt_text TEXT CHARACTER SET utf8,
        pers_religion varchar(50) CHARACTER SET utf8,
        pers_death_place TEXT CHARACTER SET utf8,
        pers_death_date DATE ,
        pers_death_time TIME ,
        pers_death_text TEXT CHARACTER SET utf8,
        pers_death_cause TEXT CHARACTER SET utf8,
        pers_death_age TINYINT ,
        pers_buried_place TEXT CHARACTER SET utf8,
        pers_buried_date DATE ,
        pers_buried_text TEXT CHARACTER SET utf8,
        pers_cremation varchar(1) CHARACTER SET utf8,
            pers_place_index text CHARACTER SET utf8,
            pers_text TEXT CHARACTER SET utf8,
            pers_alive TEXT CHARACTER SET utf8,
            pers_cal_date DATE ,
            pers_quality varchar(1) CHARACTER SET utf8 DEFAULT '',
            pers_new_user TEXT CHARACTER SET utf8 DEFAULT NULL,
            pers_changed_user TEXT CHARACTER SET utf8 DEFAULT NULL,
            pers_new_date DATE ,
            pers_new_time TIME ,
            pers_changed_date DATE ,
            pers_changed_time TIME ,
            PRIMARY KEY (`pers_id`),
            KEY (pers_prefix),
            KEY (pers_lastname),
            KEY (pers_gedcomnumber),
            KEY (pers_tree_id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8");
Firibix
Profil
Reakce na Smilee:
Datové typy TEXT a VARCHAR zabírají stejné množství místa na disku (tedy podle toho, jak dlouhý je v nich uložený řetězec).
Smilee
Profil *
Firibix:
Aha, a proč je tedy u VARCHARu ta délka nebo proč ten KEY dělá u TEXT problém?


Dobrý, už to mám přečtený. Dík
Difference between VARCHAR and TEXT in MySQL [duplicate]
Firibix
Profil
Reakce na Smilee:
U VARCHARu si můžeš nastavit libovolnou maximální délku (až do 65535 bajtů), zatímco TEXT má fixní maximální délku 65535 bajtů. Řetězec, který je kratší než maximální délka, ale bude u obou typů zabírat jen tolik místa, jak je skutečně dlouhý.

Problém s nastavením TEXTu jako klíče je přece popsaný v chybové hlášce – chybí definice délky klíče. Musíš definovat, jak dlouhá část TEXTu se má indexovat:

CREATE INDEX humo_persons_event_kind_idx ON humo_persons (event_kind(123));
Smilee
Profil *
Firibix:
Vysvětlení pro mě je že je to kvůli indexování ten rozdíl. Jinak v těch dvou bajtech skoro rozdíl není. Ještě by mě mohlo zajímat jestli když jsou prázdné něco zabíraj. Ale naco počítat bajty, to asi nemá smysl...


oprava. ne bajtech, ale typech...

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