| 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 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... |
||
|
Časová prodleva: 5 let
|
|||
0