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