Visualizzazione risultati 1 fino 4 di 4

Discussione: [MySQL] Problema con chiavi primarie / unique

  1. #1
    fabiocirelli non è connesso Utente AlterBlog
    Data registrazione
    22-05-2019
    Messaggi
    1

    Unhappy [MySQL] Problema con chiavi primarie / unique

    Buongiorno a tutti
    cercando di creare questa tabella

    Codice:
    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `email` varchar(320) COLLATE utf8_unicode_ci NOT NULL,
      `password` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
      `username` varchar(35) COLLATE utf8_unicode_ci NOT NULL,
      `birthdate` date NOT NULL,
      `bio` varchar(4800) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
      `creation_datetime` datetime NOT NULL DEFAULT current_timestamp(),
      `status` enum('Verification pending','Verified','Deletion pending','Deleted') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Verification pending',
      `profile_public` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N',
      `first_password` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `username` (`username`),
      UNIQUE KEY `email` (`email`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    phpmyadmin mi restituisce questo errore:

    Codice:
    #1071 - Specified key was too long; max key length is 767 bytes
    premetto che ho cercato di cambiare il collate del database da quello predefinito a utf8, ma me lo cambia automaticamente in utf8mb4.

    Cosa posso fare per risolvere?
    Grazie a tutti e buona giornata

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,413

    Predefinito

    Anche usando UTF8 la massima lunghezza di una chiave sarebbe 255, calcolata come limite-byte / dimensione-carattere = 767 / 3 = 255. Con UTF8m4 il limite è invece 191 caratteri.

    In ogni caso 320 è inutilmente grande, RFC2821 indica che
    The maximum total length of a reverse-path or forward-path is 256
    characters (including the punctuation and element separators).
    Probabilmente capendo bene qual'è il problema si trova il modo di usare UTF8 anziché UTF8m4, ma anche così facendo avresti una chiave lunga al massimo 255, laddove hai bisogno di 256. Hai quindi 3 scelte:
    • ignorare il problema usando 254 o 191 come limite, il sistema non sarà formalmente corretto ma è molto improbabile che questo crei problemi concreti
    • applicare un'ulteriore normalizzazione creando una tabella email_address con una chiave primaria id e le colonne username e domain separate; nella tabella users la colonna email_id potrà essere una chiave primaria
    • impostare 256 come lunghezza della colonna email, ma non renderla una chiave; potrai eventualmente rendere chiave un suo sottoinsieme:
      Codice:
      ALTER TABLE `users` ADD UNIQUE (email(191));

    I suggerimenti che do più spesso:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


  3. #3
    darbula non è connesso AlterGuru
    Data registrazione
    24-04-2011
    Messaggi
    1,787

    Predefinito

    320 caratteri per un'email é eccessiva comunque.

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,413

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    320 caratteri per un'email é eccessiva comunque.
    È un fraintendimento comune dell'RFC2821, il quale dice che la lunghezza massima per un nome utente è 64 caratteri, la lunghezza massima per un nome di dominio 255, quindi apparentemente la lunghezza massima di un indirizzo email è la somma delle due più il carattere "@": 64 + 1 + 255 = 320. Come mostrato, un'indicazione successiva indica che il massimo è comunque 256.

    I suggerimenti che do più spesso:
    • Le funzioni mysql_* sono deprecate. Usa PDO o MySQLi.
    • Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
    • Indenta correttamente il codice e usa nomi significativi per gli identificatori.


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •