• Wenn ich mich richtig erinnere, ist md5() doch dafür gemacht, schnell eine Prüfsumme eines großen Strings zu rechnen?


    Ich will einfach nur schauen ob ein Text schon mal in der Datenbank ist, und dachte das wäre ja geeignet :)

  • ungetestet und nie versucht, aber:
    Kommt drauf an wie groß/lang der Text ist.
    Wenn Dein Text mehrere hundert Zeichen lang sein kann und Du nach dem gesamten Text suchen musst, dann wäre es eine komische query an den Sql-Server

    SQL
    ...
    WHERE `text` = '....mal ein riesen langer text angenommen ...'


    Dann würde es wohl wirklich Sinn machen ne Prüfsumme von dem zu speichernden Text gleich mit zu speichern.
    In etwa:
    tbl_texte:
    `id`-- primary key
    `text`
    `md5` -- unique index


    md5 also index, damit Du nicht die ewig langen Texte indexieren musst (was bissl blöd wäre =)
    unique index, damit Du keine doppelten Texte speichern kannst.
    Den md5 kannst Du auch gleich dem Sql-Server überlassen:

    SQL
    INSERT INTO `tbl_texte`
    (`text`,`md5`)
    VALUES (:text,md5(:text))


    Dann bekommst Du ein Feedback, ob der gleiche Text schon vorhanden war.
    Spart eine vorangehende Such-Query.

  • naja, dann wäre der riesen Text wieder an den Sql-Server geschickt.
    Dann evtl doch den md5 via PHP berechnen.


    Die md5 dann immer per PHP erstellen.
    BTW: eigtl brauchst Du gar keine id, da der md5 ja unique sein sollte/muss - md5 könnte also auch primary key sein.
    ABER es soll wohl sinnvoller sein den fortlaufende numerische ids zu verwenden anstatt lange Strings. Kommt aber auch wieder auf die Masse an Daten an.

  • Dann wäre es evtl sinnvoll 2 tbl abzulegen.
    tbl_texte:
    `id`-- primary key
    `text`


    tbl_md5:
    `id_texte` -- fremdschlüssel (foreign key) von tbl_texte
    `md5` -- unique index


    Durch den Fremdschlüssel stehen die beiden Tabellen in Beziehung und es kann nur eine in tbl_texte existierende `id` in tbl_md5 eingefügt werden.
    Wenn Du also nur prüfen willst, ob ein Text schon existiert, dann suchst Du in der "schnellen" Tabelle `tbl_md5` nach dem md5 Hash.
    Natürlich holst Du Dir dabei auch gleich die `id`, um bei Bedarf den Text aus `tbl_texte` via `id` zu lesen.


    Musste Du aber abwiegen. Denn ein Insert wird dann über 2 Tabellen laufen (Stichworte "BEGIN TRANSACTION", "COMMIT", "ROLLBACK").
    Wäre halt mMn für sehr viele Datensätze angebracht.


    btw: gerade drüber gestolpert: http://stackoverflow.com/quest…t-field-in-select-results
    (als vorschau ect evtl)



    EDIT:
    ach da fällt mir gleich wieder so viel ein .. :D
    Du kannst für INSERTs auch einen Trigger erstellen:

    SQL
    CREATE TRIGGER 'triggername' 
    AFTER INSERT ON `tbl_texte` 
    FOR EACH ROW 
        INSERT INTO `tbl_md5` 
        SET `id` = NEW.`id`, `md5` = md5(NEW.`text`);


    Also wird bei jedem INSERT INTO `tbl_texte` der md5 und die id in `tbl_md5` geschickt =)
    (wenn man trigger mag)

  • okiedokie :D
    hab versucht alles so einfach wie möglich in den comments zu erklären:


    Durch die Beziehung (FOREIGN KEY) ist es jetzt nicht möglich zB eine `id_texte` mit dem Wert 2 in die Tabelle `md5` einzufügen, wenn in der Tabelle `texte` nicht auch eine `id` mit dem Wert 2 existiert.


    Kurz und einfach:
    Inhalt Tabelle `texte`

    Code
    id | text
    -----------------------
    1  | mein text ...
    2  | auch ein text ...


    Inhalt Tabelle `md5`



    INSERT:


    UPDATE:


    DELETE:


    SELECT:


    Da geht bestimmt noch was, aber das Modell an sich sollte funktionieren.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!