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

babahalki

Постоялец
Регистрация
6 Май 2016
Сообщения
247
Реакции
107
Не смог найти более правильного места, поэтому запиливаю сюда. Данную функцию пришлось делать самому, потому что найти хорошую не смог. Функция полностью повторяет 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 ;
 
Если увидите ошибку вроде этой:
shot_0126.png

Код:
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 - название базы данных.
 
Последнее редактирование:
Назад
Сверху