powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменение строки в колонке таблицы с помощью триггера
14 сообщений из 14, страница 1 из 1
Изменение строки в колонке таблицы с помощью триггера
    #39991329
maxraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

У меня есть python-скрипт, который пересылает сообщения из почтового ящика в телеграм. Проблема в том, что модуль mail-parser не понимает кириллицу и если в письме вложение на русском, то скрипт отправляет в телеграм сообщение без вложения, а сам завершается с ошибкой. В гитхабе создал issue в репозитории автора модуля mail-parser, но уже больше недели он не отвечает.

Вкратце принцип такой:

В панели хостинга клиент создает тикет и прикрепляет скриншот. Тикет дублируется на мой почтовый ящик и если python-скрипт увидел, что в папке INBOX новое письмо, то он пересылает его в телеграм. И вот, если во вложении имя файла на русском языке, то скрипт завершается с ошибкой.

Поэтому я подумал, а что если в MySQL сделать так, чтобы все имена файлов переменовывать? Имею ввиду начиная с последующего, как только клиент создаст тикет. Но как это сделать я не знаю. Если можете помочь буду очень признателен.

База:
billmgr

Таблица, где хранятся все вложения:
ticket_message_attach

Содержимое таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
MariaDB [billmgr]> SELECT * FROM ticket_message_attach WHERE id > 0 limit 10;
+----+------------------------------------------------------+------------------------------------------------------+----------------+
| id | base_name                                            | name                                                 | ticket_message |
+----+------------------------------------------------------+------------------------------------------------------+----------------+
|  2 | Безымянный.png                                       | Безымянный.png                                       |             16 |
|  3 | FAQ.docx                                             | FAQ.docx                                             |             32 |
|  4 | asortiment2017_04_08.pdf                             | asortiment2017_04_08.pdf                             |             69 |
|  5 | resume.doc                                           | resume.doc                                           |            252 |
|  6 | Снимок экрана 2017-06-09 в 20.23.18.png              | Снимок экрана 2017-06-09 в 20.23.18.png              |            259 |
|  7 | Снимок экрана 2017-06-09 в 20.23.33.png              | Снимок экрана 2017-06-09 в 20.23.33.png              |            259 |
|  8 | Снимок экрана 2017-06-09 в 20.23.43.png              | Снимок экрана 2017-06-09 в 20.23.43.png              |            259 |
|  9 | 1.jpg                                                | 1.jpg                                                |            293 |
| 10 | тест производительности.png                          | тест производительности.png                          |            312 |
| 11 | 2017-06-17_20-42-45.png                              | 2017-06-17_20-42-45.png                              |            348 |
+----+------------------------------------------------------+------------------------------------------------------+----------------+
10 rows in set (0.000 sec)



Где:
id — код записи
ticket_message — код сообщения
base_name — имя файла для отображения
name — имя файла
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991358
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените пример выборки на её CREATE TABLE (взять реальный DDL, а не создать под данные!) + INSERT INTO скрипты.
Покажите требуемый результат на этих данных.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991447
maxraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Замените пример выборки на её CREATE TABLE (взять реальный DDL, а не создать под данные!) + INSERT INTO скрипты.
Покажите требуемый результат на этих данных.


Понятно, что ничего не понятно.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991504
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, ему надо, чтобы при вставке записи в поле name вставлялось транслитерированное значение из base_name. Как-то так.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991508
maxraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сделал так

Код: sql
1.
2.
3.
4.
5.
6.
7.
DELIMITER //
CREATE TRIGGER `rename_attach_name` BEFORE INSERT ON `billmgr`.`ticket_message_attach`
FOR EACH ROW 
   BEGIN
    SET NEW.name = md5(NEW.name);
   END//
DELIMITER;



Затем создал новое сообщение с вложением "снимок.PNG" в панели управления, после этого смотрю таблицу и вижу появился id 2 с вместо имени "снимок.PNG" в виде хэша.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
MariaDB [billmgr]> SELECT * FROM `ticket_message_attach`
    -> ;
+----+------------------+----------------------------------+----------------+
| id | base_name        | name                             | ticket_message |
+----+------------------+----------------------------------+----------------+
|  1 | Снимок.PNG       | Снимок.PNG                       |              1 |
|  2 | Снимок.PNG       | 4ca61df6137d46eebb9e82b403b87d75 |              2 |
+----+------------------+----------------------------------+----------------+
2 rows in set (0.00 sec)



Всё отлично, но проблема в том, что в имени "4ca61df6137d46eebb9e82b403b87d75" теряется расширение файла. А должно быть таким "4ca61df6137d46eebb9e82b403b87d75.PNG"

Поделитесь пожалуйста решением как избежать хэширования расширения. Заведомо неизвестно, какое может быть расширение, оно может быть *.doc, *.docx, *png, *jpeg и тд.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991540
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
строковые функции никто не отменял
имя_файла . расширение

имя_файла меняем. дописываем ".расширение"
имя файла = SUBSTRING_INDEX(name , '.', -1)
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991633
maxraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,попробовал так

Код: sql
1.
2.
3.
4.
5.
6.
7.
DELIMITER //
CREATE TRIGGER `rename_attach_name` BEFORE INSERT ON `billmgr`.`ticket_message_attach`
FOR EACH ROW 
   BEGIN
	SET NEW.name = md5(SUBSTRING_INDEX(name , '.', -1)); 
   END//
DELIMITER;



Затем отправил тикет с вложением Снимок - копия - копия.PNG, но MD5 не сработал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Database changed
MariaDB [billmgr]> SELECT * FROM `ticket_message_attach`;
+----+--------------------------------------------+--------------------------------------------+----------------+
| id | base_name                                  | name                                       | ticket_message |
+----+--------------------------------------------+--------------------------------------------+----------------+
|  1 | Снимок.PNG                                 | Снимок.PNG                                 |              1 |
|  2 | Снимок.PNG                                 | 4ca61df6137d46eebb9e82b403b87d75           |              2 |
|  3 | Снимок - копия.PNG                         | 2feef0c7c6b6896294e6e26cf610b55e           |              3 |
|  4 | Снимок - копия.PNG                         | e3a7c4afe5737dce788e45c9aea18bb9           |              4 |
| 10 | Снимок - копия - копия.PNG                 | Снимок - копия - копия.PNG                 |             11 |
+----+--------------------------------------------+--------------------------------------------+----------------+
5 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991634
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я же привел только пример... да и то ошибку сделал. ..
Код: sql
1.
2.
3.
4.
5.
SUBSTRING_INDEX(name , '.', -1) /*- расширение*/
SUBSTRING_INDEX(name , '.', 1) /*- имя файла*/

/* получаем */
name = CONCAT(md5(SUBSTRING_INDEX(base_name, '.', 1)), ".", SUBSTRING_INDEX(base_name, '.', -1));


осталось понять, осознать, применить...
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991734
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
Код: sql
1.
2.
SUBSTRING_INDEX(name , '.', -1) /*- расширение*/
SUBSTRING_INDEX(name , '.', 1) /*- имя файла*/


Записи id = 6, 7, 8 из исходного сообщения дадут неверный результат - имя будет обрезано.

С другой стороны - а зачем отрезать расширение перед хэшированием? хешируем всё, а потом добавляем расширение...
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991739
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

я не даю конкретных решений под ключ.
Человеку если надо - он сам разберется.
Внизу пояснение для ТС
"осталось понять, осознать, применить..."
Решение через строковые функции имеет десяток вариантов. мне показать все что ли...
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991742
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
допустим я бы не мучался даже со строковыми функциями и сделал функцию транслитерации РУС->ENG.
Всего лишь 33 REPLACE(). Заодно и пробел на подчеркивание заменить.
Не люблю разовые поделки. А функция всегда пригодится.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991745
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
допустим я бы не мучался даже со строковыми функциями и сделал функцию транслитерации РУС->ENG.
Всего лишь 33 REPLACE().

Дык готовые функции транслитерации - что по ГОСТ, что по иным алгоритмам, в т.ч. обратимые - они есть (искать только замучаешься, чтобы была именно в виде, пригодном для компиляции под использование в MySQL). А кто сделал - вот не рвётся выкладывать для всеобщего употребления. Но проблема, в общем, решаемая.

Ну а регистрация UDF - не самая сложная задача.
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991765
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все же просто на коленке,
даже если влоб
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
DELIMITER $$

--
-- Создать функцию `TransRuEn`
--
CREATE DEFINER = 'root'@'localhost'
FUNCTION TransRuEn (Param1 text)
RETURNS text CHARSET utf8
DETERMINISTIC
BEGIN
--  DECLARE Translit text DEFAULT "";
  SET Param1 = REPLACE(Param1, ' ', '_');
  --  SET Translit = Param1;
  SET Param1 = REPLACE(REPLACE(Param1, "а", "a"), "А", "A");
  SET Param1 = REPLACE(REPLACE(Param1, "б", "b"), "Б", "B");
  SET Param1 = REPLACE(REPLACE(Param1, "в", "v"), "В", "V");
  SET Param1 = REPLACE(REPLACE(Param1, "г", "g"), "Г", "G");
  SET Param1 = REPLACE(REPLACE(Param1, "д", "d"), "Д", "D");
  SET Param1 = REPLACE(REPLACE(Param1, "е", "e"), "Е", "E");
  SET Param1 = REPLACE(REPLACE(Param1, "ё", "jo"), "Ё", "JO");
  SET Param1 = REPLACE(REPLACE(Param1, "ж", "gh"), "Ж", "GH");
  SET Param1 = REPLACE(REPLACE(Param1, "з", "z"), "З", "Z");
  SET Param1 = REPLACE(REPLACE(Param1, "и", "i"), "И", "I");
  SET Param1 = REPLACE(REPLACE(Param1, "к", "k"), "К", "K");
  SET Param1 = REPLACE(REPLACE(Param1, "л", "l"), "Л", "L");
  SET Param1 = REPLACE(REPLACE(Param1, "м", "m"), "М", "M");
  SET Param1 = REPLACE(REPLACE(Param1, "н", "n"), "Н", "N");
  SET Param1 = REPLACE(REPLACE(Param1, "о", "o"), "О", "O");
  SET Param1 = REPLACE(REPLACE(Param1, "п", "p"), "П", "P");
  SET Param1 = REPLACE(REPLACE(Param1, "р", "r"), "Р", "R");
  SET Param1 = REPLACE(REPLACE(Param1, "с", "s"), "С", "S");
  SET Param1 = REPLACE(REPLACE(Param1, "т", "t"), "Т", "T");
  SET Param1 = REPLACE(REPLACE(Param1, "у", "u"), "У", "U");
  SET Param1 = REPLACE(REPLACE(Param1, "ф", "f"), "Ф", "F");
  SET Param1 = REPLACE(REPLACE(Param1, "х", "h"), "Х", "H");
  SET Param1 = REPLACE(REPLACE(Param1, "ц", "ts"), "Ц", "TS");
  SET Param1 = REPLACE(REPLACE(Param1, "ч", "ch"), "Ч", "CH");
  SET Param1 = REPLACE(REPLACE(Param1, "ш", "sh"), "Ш", "SH");
  SET Param1 = REPLACE(REPLACE(Param1, "щ", "shz"), "Щ", "SHZ");
  SET Param1 = REPLACE(REPLACE(Param1, "ъ", "''"), "Ъ", "''");
  SET Param1 = REPLACE(REPLACE(Param1, "ы", "y"), "Ы", "Y");
  SET Param1 = REPLACE(REPLACE(Param1, "ь", "'"), "Ь", "'");
  SET Param1 = REPLACE(REPLACE(Param1, "э", "e"), "Э", "E");
  SET Param1 = REPLACE(REPLACE(Param1, "ю", "ju"), "Ю", "JU");
  SET Param1 = REPLACE(REPLACE(Param1, "я", "ja"), "Я", "JA");

  RETURN Param1;
END
$$

DELIMITER ;

спецом без цикла 1..33
обратных 1 в 1 не существует, так что это не самоцель
...
Рейтинг: 0 / 0
Изменение строки в колонке таблицы с помощью триггера
    #39991784
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
появилось время
дополним с циклом, так удобнее для редакции
функция "шифрограмма"
Ъ-два апострофа
Ь - один
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE DEFINER = 'root'@'localhost'
FUNCTION test.TranslitEn(InPar TEXT)
  RETURNS TEXT CHARSET utf8
  DETERMINISTIC
BEGIN
DECLARE rus,eng char(128);
DECLARE i int DEFAULT 33;
DECLARE r,e char(5);

SET rus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
SET eng = "a,b,v,g,d,e,e,g,z,i,ii,k,l,m,n,o,p,r,s,t,u,f,kh,ts,ch,sh,sch,'',y,',e,yu,ja";
SET InPar = REPLACE(InPar, ' ', '_'); -- пробел на подчеркивание
WHILE i > 0 DO 
  SET r = MID(rus,i,1);
  SET e = SUBSTRING_INDEX( SUBSTRING_INDEX(eng,',',i), ',', -1);
  SET InPar = REPLACE(InPar,r,e);
  SET InPar = REPLACE(InPar,UCASE(r),UCASE(e));  
  SET i = i - 1;
END WHILE;

RETURN InPar;
END

...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменение строки в колонке таблицы с помощью триггера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]