БлогЪТ на Стан


Заигравка с функции за низове в MySQL

Posted in Бази от данни by Стан on the September 13th, 2006

Обикновено при разработването на галерия от изображения, се налага да имаме поне две изображения - умалено (thumb-nail) и с нормален размер. Един от начините е посредством функциите на графичната библиотека да генерираме умаленото изображение(начин консумиращ известно количество памет, често надвишаващо стойността на memory_limit директивата в PHP.INI), като в базата от данни пазим само името на оригиналното а умаленото именуваме с някаква наставка (примерно _thumb). Разбира се съществуват и други начини, като съхраняване на цялото изображение в поле от таблицата, но тук става дума само за първия.

Нека приемем, че имаме следната структура на таблица “picture”

CREATE TABLE `picture` (
    `id` mediumint(8) unsigned NOT NULL auto_increment,
    `url` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Също така, нека приемем, че уеб сървърът е доста натоварен и искаме да го освободим от малко работа, която така или иначе може да свърши(а и в повечето случаи е по-добре да свърши) и MySQL сървъра. Принципно въпросното количество работа в общия случай се върши по-бързо от MySQL сървъра.

Т.е. в текущия случай, целта на задачата, е посредством функциите на MySQL за работа с низове да изградим името на умаленото изображение, което после да използваме директно като част от стойността на атрибута src на IMG елемента.

Ето един вариант как може да се реализира това.

SELECT
    url as image,
    CONCAT(SUBSTRING(url, 1, LENGTH(url)-LOCATE(".", REVERSE(url))), "_thumb", RIGHT(url,LOCATE(".", REVERSE(url)))) as thumb
FROM
    picture;

И естествено резултата от изпълнението на SQL заявката:

+----------------------------+----------------------------------+
| image                      | thumb                            |
+----------------------------+----------------------------------+
| testasdas.adasd.asdasd.jpg | testasdas.adasd.asdasd_thumb.jpg |
| test.jpg                   | test_thumb.jpg                   |
+----------------------------+----------------------------------+
2 rows in set (0.02 sec)

Убеден съм, че въпреки ограничения брой на функциите на MySQL за работа с низове (известна част от които са псевдоними) тази задачка може да се реши по няколко различни начина.

Решавал съм този проблем(задачка) с PHP функцията strrpos, но в MySQL няма функция, която връща последната поява на низ в друг низ и въпреки, че не съм религиозен се сетих за онези думи от евангелието “Последните ще станат първи” и за функцията REVERSE() на MySQL, която ми помогна да изпълня божиите слова.

Извода е: Натоварaвйте MySQL сървъра, той “носи на бой” :)

4 Responses to 'Заигравка с функции за низове в MySQL'

Subscribe to comments with RSS or TrackBack to 'Заигравка с функции за низове в MySQL'.

  1. Sentinel said,

    on September 13th, 2006 at 6:16 pm

    :-) ок, добра работа с низовете, ама…. защо просто не пазиш тумбнейлите в друга директория .. така името на директорията ти определя типа на изображението, а в базата се пази едно единствено URL, …. при положение че искаш да дадеш почивка на сървъра .. мисля че това е най-добрия вариант …. :-)

  2. Стан said,

    on September 13th, 2006 at 8:24 pm

    Това вече е въпрос на избор. Аз лично съм свикнал да виждам всички файлове, които се качват в една папка.

  3. Sentinel said,

    on September 15th, 2006 at 1:41 pm

    мхм… това да не е пак великата open source идеология - “не е важно да свършим работата, важното е да си начешим езиците” :-)

  4. Стан said,

    on September 15th, 2006 at 2:02 pm

    Важното е да имаме свободата на избор и да се развиваме ;)

Leave a Reply