Дополнение строки до заданной длины с обоих краев в MySQL

Функция STRING_PAD_BOTH()

В MySQL нет отдельной функции для данной задачи. Однако ее можно создать самостоятельно.

Исходный код

DROP FUNCTION IF EXISTS STRING_PAD_BOTH;

DELIMITER $$

CREATE FUNCTION STRING_PAD_BOTH(string TEXT, padLength INT, padString TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
	DECLARE result TEXT DEFAULT NULL;
	IF (padLength = 0) THEN SET result = '';
	ELSEIF (padLength > 0) THEN
		BEGIN
			DECLARE padLengthDiff INT DEFAULT 0;
			SET padLengthDiff = padLength - CHAR_LENGTH(string);
			IF (padLengthDiff = 0) THEN SET result = string;
			ELSEIF (padLengthDiff > 0) THEN
				BEGIN
					DECLARE padLengthLeft INT DEFAULT 0;
					DECLARE padLengthRight INT DEFAULT 0;
					DECLARE padStringLength INT DEFAULT 0;
					SET padLengthLeft = FLOOR(padLengthDiff / 2);
					SET padLengthRight = padLengthDiff - padLengthLeft;
					SET padStringLength = CHAR_LENGTH(padString);
					SET result = CONCAT(
						SUBSTRING(REPEAT(padString, CEIL(padLengthLeft / padStringLength)), 1, padLengthLeft),
						string,
						SUBSTRING(REPEAT(padString, CEIL(padLengthRight / padStringLength)), 1, padLengthRight)
					);
				END;
			ELSE SET result = SUBSTRING(string, 1, padLength);
			END IF;
		END;
	END IF;
	RETURN result;
END$$

DELIMITER ;

Аргументы

  1. string — дополняемая строка;
  2. padLength — нужная длина строки;
  3. padString — строка дополнения.

Возвращаемое значение

Возвращает строку string, дополненную до длины padLength с обоих краев.

Особенности

  • Безопасна для многобайтных строк.
  • Если padLength равен нулю, то строка string будет обрезана до нулевой длины, т.е. будет возвращена пустая строка.
  • Если padLength меньше нуля, то будет возвращен NULL.
  • Если padLength меньше длины строки string, то строка string будет обрезана с правого края до длины padLength.
  • Важно помнить, что при вычислении левого и правого дополнений строки в приоритете правый край. Т.е. если нужно увеличить строку на 3 символа, то к правому краю добавиться 2 символа, а к левому — 1.