J'essaie de créer un système de commande, mais je suis bloqué pour le moment. Dans le tableau mysql, j'utilise varchar (255) dans une colonne nommée "bestillinger", mais il ne peut stocker que 255 caractères. . J'ai donc cherché un peu et me suis rappelé que je pouvais utiliser un longtext ou simplement du texte, mais maintenant, lorsque j'essaie de le faire, j'obtiens une erreur en disant:
#1170 - BLOB/TEXT column 'bestilling' used in key specification without a key length
J'ai essayé de chercher ici et dans Google, mais je n'ai pas eu de chance avec moi.
Mon tableau MySQL est:
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` int(11) NOT NULL,
`bestilling` TEXT NOT NULL PRIMARY KEY,
`accepted` varchar(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (`id`,`bestilling`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
J'utilise UNIQUE KEY parce que j'utilise "ON DUPLICATE KEY UPDATE" dans ma partie PHP. Mais ça ne te dérange pas.
Merci d'avance.
vous ne pouvez pas définir un texte en tant que clé primaire. Mysql seul peut indexer certains caractères et le texte peut être trop gros pour être indexé.
jetez un oeil ici:
À partir de votre définition ci-dessus et du monologue verbal dans cette réponse ci-dessous, je suggère la révision suivante:
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`bestilling` TEXT NOT NULL,
`hashcode` CHAR(32) AS (MD5(bestilling)),
`accepted` VARCHAR(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (hashcode,bestilling(333))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Spécifique à MySQL , la longueur maximale par défaut d'une clé d'index à une colonne est 1000 octets long ( 767 octets pour les tables InnoDB , à moins que innodb_large_prefix ne soit défini). La même limite de longueur s'applique à tout préfixe de clé d'index (les N premiers caractères pour CHAR, VARCHAR, TEXT ou les N premiers octets pour BINARY, VARBINARY, BLOB). Notez la différence de caractère par octet; En supposant un jeu de caractères UTF-8 et un maximum de 3 octets pour chaque caractère, vous pouvez atteindre cette limite avec un index de préfixe de colonne supérieur à 333 caractères sur une colonne TEXT ou VARCHAR. En pratique, le 333 a tendance à être un bon max pour moi.
De même, dans SQL Server , il existe une limite de 900 octets pour la taille totale maximale de toutes les colonnes de clé d'index.
Mais cela n'utilise que les premiers caractères de votre texte comme clé, avec les collisions évidentes imminentes.
Dans la réponse acceptée, il est suggéré d’utiliser un FULLTEXT index . Un index FULLTEXT est spécialement conçu pour la recherche de texte et offre de moins bonnes performances pour INSERT/DELETE puisqu'il maintient un N-gramme sur le vocabulaire des enregistrements de colonne et stocke le vecteur résultant. Cela fonctionnerait si chaque opération utilisait des fonctions de recherche de texte dans une clause where ... mais pas pour un index unique. Il existe également à la fois une clé primaire et une clé unique définie sur «id», ce qui semble redondant ou je manque l'intention.
Au lieu de cela, je suggère un hachage calculé. vous auriez raison de dire qu’il est possible (Birthday Paradox) d’entraîner une collision avec un hachage, aussi un index UNIQUE ne suffit-il pas. Nous allons le coupler avec un index de préfixe de colonne, comme décrit ci-dessus, pour nous donner confiance dans l'unicité.
Je suppose que l’intention de votre colonne ID est d’autoriser le référencement correct des clés étrangères à partir d’autres tables. Très bien, mais ce serait la clé primaire la plus utile pour cette table. De plus, int (11) fait référence à la largeur d'affichage de la colonne, pas à la valeur sous-jacente. J'ai mis un auto_increment non signé sur 'id' également, afin de clarifier son rôle pour le grand public.
Et cela nous amène à la conception proposée ci-dessus.
utilisez ceci
CREATE TABLE IF NOT EXISTS `bestillinger` (
`id` int(11) NOT NULL,
`bestilling` TEXT NOT NULL PRIMARY KEY,
`accepted` varchar(255) DEFAULT NULL,
UNIQUE KEY `id_bestilling` (`id`,`bestilling`(767))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
767 est la limite dans mysql pour les index blob/text
Réf: http://dev.mysql.com/doc/refman/5.7/fr/innodb-restrictions.html
Je pense que l'exemple suivant expliquera le mieux ce problème.
J'ai eu le problème parce que j'essayais de définir un champ de texte sur UNIQUE. J'ai résolu le problème en changeant le type de données du courrier électronique (TEXT) en courrier électronique (VARCHAR (254)).
mysql> desc users;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(50) | NO | | NULL | |
| lname | varchar(50) | NO | | NULL | |
| uname | varchar(20) | NO | | NULL | |
| email | text | NO | | NULL | |
| contact | bigint(12) | NO | | NULL | |
| profile_pic | text | NO | | NULL | |
| password | varchar(20) | NO | | admin | |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql> ALTER TABLE users ADD UNIQUE(email);
ERROR 1170 (42000): BLOB/TEXT column 'email' used in key specification without a key length
mysql>
mysql> ALTER TABLE users MODIFY email VARCHAR(254);
Query OK, 9 rows affected (0.02 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE users ADD UNIQUE(email);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc users;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| fname | varchar(50) | NO | | NULL | |
| lname | varchar(50) | NO | | NULL | |
| uname | varchar(20) | NO | | NULL | |
| email | varchar(254) | YES | UNI | NULL | |
| contact | bigint(12) | NO | | NULL | |
| profile_pic | text | NO | | NULL | |
| password | varchar(20) | NO | | admin | |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql>