Autor | Zpráva | ||
---|---|---|---|
Smilee Profil * |
#1 · Zasláno: 20. 12. 2020, 10:44:44
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 |
#2 · Zasláno: 20. 12. 2020, 10:59:09
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 |
#4 · Zasláno: 20. 12. 2020, 11:35:47
Reakce na Smilee:
U VARCHAR u 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 TEXT u jako klíče je přece popsaný v chybové hlášce – chybí definice délky klíče. Musíš definovat, jak dlouhá část TEXT u 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... |
||
Časová prodleva: 4 roky
|
0