MYSQL аналог PHP функции rawurlencode()

Тема в разделе "Базы данных", создана пользователем babahalki, 21 июн 2018.

Модераторы: latteo
  1. babahalki

    babahalki

    Регистр.:
    6 май 2016
    Сообщения:
    247
    Симпатии:
    93
    Не смог найти более правильного места, поэтому запиливаю сюда. Данную функцию пришлось делать самому, потому что найти хорошую не смог. Функция полностью повторяет rawurlencode() в php, т.е. русские буквы пробелы и вся остальная муть становиться punycode, а цифры, буквы - и _ остаются просто текстом. Обратите внимание, что символ № хотя и присутствует в таблице ASCII - все равно кодируется в UTF8 3 байтами. Данная функция справляется с такими экзотическими символами, правильно кодируя их 3 парами hex чисел через %.

    Код:
    DROP FUNCTION IF EXISTS rawurlencode;
    DELIMITER |
    CREATE FUNCTION rawurlencode (s VARCHAR(4096)) RETURNS VARCHAR(4096)
    DETERMINISTIC
    CONTAINS SQL
    BEGIN
           DECLARE c VARCHAR(20) DEFAULT '';
           DECLARE cc VARCHAR(20) DEFAULT '';
           DECLARE h VARCHAR(20) DEFAULT '';
           DECLARE hh VARCHAR(20) DEFAULT '';
           DECLARE pointer INT DEFAULT 1;
           DECLARE len INT DEFAULT 0;
           DECLARE s2 VARCHAR(4096) DEFAULT '';
    
           IF ISNULL(s) THEN
               RETURN NULL;
           ELSE
           SET s2 = '';
           WHILE pointer <= length(s) DO
              SET c = MID(s,pointer,1);
              SET cc = ASCII(c);
              IF NOT (cc IN (45,46,126,95) OR #-.~_
                      cc BETWEEN 48 AND 57 OR
                    cc BETWEEN 65 AND 90 OR
                    cc BETWEEN 97 AND 122
              ) THEN
                set h = HEX(c);
                set len = CHAR_LENGTH(h) / 2;
                set c = '';
                WHILE (len > 0) DO
                    set hh = MID(h,1,2);
                    set h = MID(h,3);
                    set len = CHAR_LENGTH(h) / 2;
                    set c = CONCAT(c, "%",hh);
                END WHILE;
              END IF;
              SET s2 = CONCAT(s2,c);
              SET pointer = pointer + 1;
           END while;
           END IF;
           RETURN s2;
    END;
    |
    DELIMITER ;
    
     
    Black Hat нравится это.
  2. Black Hat

    Black Hat

    Регистр.:
    15 май 2015
    Сообщения:
    163
    Симпатии:
    108
    Если увидите ошибку вроде этой:
    [​IMG]
    Код:
    ERROR 1366 (HY000) at line 1: Incorrect string value: '\xD0\x9F\xD1\x80\xD0\xB8...' for column 's' at row 1
    
    То следует сменить кодировку базы данных:

    Код:
    ALTER DATABASE test DEFAULT CHARACTER SET utf8;
    
    Где test - название базы данных.
     
    Последнее редактирование: 21 июн 2018