12
votes

Fonction stockée MySQL pour créer une limace

Y a-t-il une fonction stockée mysql pour créer une limace à partir d'une URL (ou une valeur vraiment).

Donc, ma requête peut être: p>

SELECT *, SLUG(url) FROM clients


7 Réponses :


2
votes

Je ne suis pas sûr que je recommanderais de faire cela dans SQL, mais voici un gars qui a fait une fonction appelée "Slugify":

http: // nastyhabit .wordpress.com / 2008/09/25 / MySQL-Slug-Maker-Fonction-AKA-the-Slugifier /


4 commentaires

J'ai trouvé cela et sa solution ne semblait pas attrayante ... peut-être que je peux en prendre des idées. Pourquoi ne le suggérez-vous pas?


Je pense qu'il serait plus facile de mettre en œuvre sur la couche d'application des choses, dans PHP dans votre cas. Au moins, ce serait pour moi. Je ne suis pas SQL Whiz. Pour le formatage des données (ce qui est à peu près ce que c'est), j'aime laisser cela jusqu'au consommateur des données. Vous devez également effectuer des tests de vitesse pour voir quelle méthode est plus efficace. Je pense que cela déterminera quelle méthode convient à votre cas.


Oui, c'est ce que je fais que je faisais, essayant de trouver des numéros de référence et de décider de là.


Peut-être que la logique n'est pas dans PHP ou WordPress et ceci est dans un traitement de masse SQL. Il sera gênant de créer une ligne PHP par routine ligne juste pour cela.



7
votes

J'ai pris le slugifier de http: //nastyhabit.wordpress. COM / 2008/09/25 / MySQL-Slug-Maker-Fonction-AKA-The-Slugifier /

et la modifier pour ne pas inclure "-" Au début, (nous avions "$" comme le Premier caractère)

Voici mon résultat: xxx

fonctionne bien, mais! C'est assez lent. Si vous essayez de choisir quelque chose de cela, vous allez ajouter environ 1000% de temps à la requête comparée à la sélection d'une colonne pré-gonflée qui est indexée.

gonfgée pour 500 résultats était .27 secondes Non-Sluggeged (via MySQL) était .00003 secondes

pour insérer des données cependant, cette fonction fonctionnerait bien! Il suffit d'insérer les données gonflées dans une colonne prédéfinie (celle indexée, car pourquoi ne voudriez-vous pas sélectionner quelque chose qui sluggeged?)

Remarque: le texte à "slugifié" doit être en minuscule en premier, comme cela La fonction ne gère pas les lettres majuscules (les convertit sur '-').


5 commentaires

Obtenait des erreurs avec l'original - celui-ci a fonctionné hors de copie / colle Grin - merci


Il supprime le premier personnage pour moi.


La fonction ci-dessus est buggy lorsque deux mots sont transmis (Nouvelle-Zélande) devient Ew-Ealand. La fonction fournie par Greg ci-dessous n'a pas ce problème.


Toujours lent - une heure et demie pour obtenir les limaces pour 50 000 rangées


changement de réglage temp_string = sale_string; définir temp_string = plâtre (Dirty_string); m'a été utile pour moi



2
votes

J'ai ajouté des lignes à la fonction Robert Publié, afin de vous assurer que la limace est toujours unique.

Ceci passe juste avant la fin de la fonction, comme vous pouvez le voir ci-dessous. Assurez-vous d'indiquer le nom de la table sans les crochets []. P>

    SELECT COUNT(*) INTO i FROM [table name goes here] WHERE slug LIKE CONCAT('%',temp_string,'%');
    If i > 0 Then
        Set temp_string = CONCAT(temp_string,'-',i+1);
    End If;

    Return temp_string;
END;;
DELIMITER ;


0 commentaires

25
votes

Il s'agit d'une version améliorée de la réponse de Robert Ross. Il est beaucoup plus rapide puisqu'il évite de boucler à travers tous les caractères autorisés et de vérifier simplement en comparant les codes ASCII.

DROP FUNCTION IF EXISTS `slugify`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost`
FUNCTION `slugify`(dirty_string varchar(200))
RETURNS varchar(200) CHARSET latin1
DETERMINISTIC
BEGIN
    DECLARE x, y , z Int;
    Declare temp_string, new_string VarChar(200);
    Declare is_allowed Bool;
    Declare c, check_char VarChar(1);

    set temp_string = LOWER(dirty_string);

    Set temp_string = replace(temp_string, '&', ' and ');

    Select temp_string Regexp('[^a-z0-9\-]+') into x;
    If x = 1 then
        set z = 1;
        While z <= Char_length(temp_string) Do
            Set c = Substring(temp_string, z, 1);
            Set is_allowed = False;
            If !((ascii(c) = 45) or (ascii(c) >= 48 and ascii(c) <= 57) or (ascii(c) >= 97 and ascii(c) <= 122)) Then
                Set temp_string = Replace(temp_string, c, '-');
            End If;
            set z = z + 1;
        End While;
    End If;

    Select temp_string Regexp("^-|-$|'") into x;
    If x = 1 Then
        Set temp_string = Replace(temp_string, "'", '');
        Set z = Char_length(temp_string);
        Set y = Char_length(temp_string);
        Dash_check: While z > 1 Do
            If Strcmp(SubString(temp_string, -1, 1), '-') = 0 Then
                Set temp_string = Substring(temp_string,1, y-1);
                Set y = y - 1;
            Else
                Leave Dash_check;
            End If;
            Set z = z - 1;
        End While;
    End If;

    Repeat
        Select temp_string Regexp("--") into x;
        If x = 1 Then
            Set temp_string = Replace(temp_string, "--", "-");
        End If;
    Until x <> 1 End Repeat;

    If LOCATE('-', temp_string) = 1 Then
        Set temp_string = SUBSTRING(temp_string, 2);
    End If;

    Return temp_string;
END;;
DELIMITER ;


2 commentaires

Merci, c'est beaucoup plus vite! Vous avez une solution plus rapide à la réponse ci-dessous pour vérifier si la limace est unique?


OMG! Mec, si tu étais ma fille je te marierais! Celui-ci est génial! Bien fait, vraiment bien fait! Merci beaucoup!



2
votes

J'ai mis en œuvre ma propre fonction de limace prenant en charge des caractères accentués, toute contribution à celle-ci est la bienvenue.

https://github.com/falcacibar/ mysql-routines-collection / blob / maître / generate_slug.func.sql

N'hésitez pas à poster des suggestions, des bogues ou de tout problème ou contribution sur GitHub ou ici mais c'est mieux github


6 commentaires

Qu'en est-il de l'alphabet russe?


Excusez-moi pour mon ignorance, mais je ne sais pas trop de l'alphabet russe, mais vous pouvez contribuer si vous voulez, vous pouvez ajouter les cas =), ou vous pouvez m'envoyer des caractères équivalents.


Bien sûr, il ne gérait pas toutes les classes, il a été créé pour résoudre un besoin particulier, est développé pour résoudre les accents latin1. Et mon point était que vous pouvez contribuer à gérer plus de cas.


@Felipealcacibar Quelle est la fonction tr dans votre routine? Ahh ok je l'ai trouvé, on m'a pensé que c'était un gist mais c'est un repo.


@ygaradon dans le même repo


Hey, belle fonction, mais sur mon esprit 2 problèmes: 1. Les originaux "-" sont supprimés, ils doivent rester 2. "" "sont supprimés au lieu de remplacer par" - "



0
votes

J'ai utilisé ce code pendant une longue période. Poster ici pour se souvenir et peut-être aider quelqu'un de nos jours

Il suffit de copier / coller cet extrait dans votre onglet de requête MySQL et de l'exécuter.

- SUPPOSEZ VOTRE utilisateur est root et hôte est localhost. Sinon, changez la valeur d'utilisateur racine et localhost pour correspondre à vous xxx

Il créera une fonction que vous pouvez appeler comme: xxx < p> Il obtiendra my_any_column_id_like_to_slug valeur et réécrire / copie sur My_new_slug_column dans le tableau my_table

Vous pouvez également convertir une colonne avec texte à sa limace comme: xxx

Ce cas mettra à jour mon_columne lui-même, par exemple 'Oh mon gosh' sera 'oh-my-gosh'


0 commentaires

1
votes

Mes deux cents: xxx


1 commentaires

C'est une solution claire.