sql >> データベース >  >> RDS >> Mysql

スラッグを作成するためのmySQLストアド関数

    これはロバート・ロスの答えの改良版です。許可されたすべての文字のループを回避し、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 ;
    


    1. mysqlテーブルから一意のキーを削除する方法

    2. データベース設計は、教師、レッスン、および学生の編成にどのように役立ちますか?

    3. mysql変数を使用したMysqlクエリがZendFramework1で機能しない

    4. マージレプリケーションでの列レベルと行レベルの追跡