Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменение строки в колонке таблицы с помощью триггера / 14 сообщений из 14, страница 1 из 1
21.08.2020, 08:13
    #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
21.08.2020, 10:56
    #39991358
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение строки в колонке таблицы с помощью триггера
Замените пример выборки на её CREATE TABLE (взять реальный DDL, а не создать под данные!) + INSERT INTO скрипты.
Покажите требуемый результат на этих данных.
...
Рейтинг: 0 / 0
21.08.2020, 15:02
    #39991447
maxraf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение строки в колонке таблицы с помощью триггера
Akina
Замените пример выборки на её CREATE TABLE (взять реальный DDL, а не создать под данные!) + INSERT INTO скрипты.
Покажите требуемый результат на этих данных.


Понятно, что ничего не понятно.
...
Рейтинг: 0 / 0
21.08.2020, 16:34
    #39991504
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение строки в колонке таблицы с помощью триггера
Akina, ему надо, чтобы при вставке записи в поле name вставлялось транслитерированное значение из base_name. Как-то так.
...
Рейтинг: 0 / 0
21.08.2020, 16:41
    #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
21.08.2020, 17:57
    #39991540
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение строки в колонке таблицы с помощью триггера
строковые функции никто не отменял
имя_файла . расширение

имя_файла меняем. дописываем ".расширение"
имя файла = SUBSTRING_INDEX(name , '.', -1)
...
Рейтинг: 0 / 0
22.08.2020, 13:41
    #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
22.08.2020, 13:58
    #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
23.08.2020, 12:07
    #39991734
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение строки в колонке таблицы с помощью триггера
Alex_Ustinov
Код: sql
1.
2.
SUBSTRING_INDEX(name , '.', -1) /*- расширение*/
SUBSTRING_INDEX(name , '.', 1) /*- имя файла*/


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

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

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

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

Ну а регистрация UDF - не самая сложная задача.
...
Рейтинг: 0 / 0
23.08.2020, 16:53
    #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
23.08.2020, 18:27
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Изменение строки в колонке таблицы с помощью триггера / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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