powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транслит функцией
10 сообщений из 10, страница 1 из 1
Транслит функцией
    #38619495
aMacedonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, к сожалению на этом форуме не нашел подходящего варианта для своего применения,
нашел на другом источнике и немного модифицировал на свой лад, только вот ожидаемый результат с деффектом.
Помогите разобраться в чем проблема.

Предварительно создаю функцию, собственно в ней какой-то деффект:

Код: plsql
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.
DELIMITER $$

DROP FUNCTION IF EXISTS `_fs_transliterate_ru` $$
CREATE DEFINER=`root`@`localhost`
  FUNCTION `_fs_transliterate_ru`(str TEXT)
  RETURNS text CHARSET utf8
DETERMINISTIC SQL SECURITY INVOKER
BEGIN
  DECLARE strlow TEXT;
  DECLARE sub VARCHAR(3);
  DECLARE res TEXT;
  DECLARE len INT(11);
  DECLARE i INT(11);
  DECLARE pos INT(11);
  DECLARE alphabeth CHAR(34);

  SET i = 0;
  SET res = '';
  SET strlow = LOWER(str);
  SET len = LENGTH(str); 
  SET alphabeth = ' абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

  /* идем циклом по символам строки */

  WHILE i <= len DO

  SET i = i + 1;
  SET pos = INSTR(alphabeth, SUBSTR(strlow,i,1));

  /*выполняем преобразование припомощи ф-ии ELT */

  SET sub = elt(pos, '-',
  'a','b','v','g', 'd', 'e', 'e','zh', 'z',
  'i','j','k','l', 'm', 'n', 'o', 'p', 'r',
  's','t','u','f', 'h', 'c','ch','sh','sch',
  '', 'y', '','e','ju','ja');

  IF sub IS NOT NULL THEN
    SET res = CONCAT(res, sub);
    END IF;

  END WHILE;

  RETURN res;
END $$

DELIMITER ;



Далее вызываю:

Код: plsql
1.
SELECT `caption`, _fs_transliterate_ru(`caption`)as `url` FROM tv_news WHERE id_news = '23420'



На входе: (Как начать ремонт в квартире?)
На выходе: (kak-nachat-remont-v-kvartire--------------------------)

Собственно откуда берутся лишние символы "--------------------------" не могу понять.

Прошу помочь.
...
Рейтинг: 0 / 0
Транслит функцией
    #38619507
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_length LENGTH(str)

Returns the length of the string str, measured in bytes. A multi-byte character counts as multiple bytes. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.
...
Рейтинг: 0 / 0
Транслит функцией
    #38619509
aMacedonian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с применением CHAR_LENGTH() работает, огромное спасибо!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Транслит функцией
    #39217001
vasil_vasil_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже использовал эту же функцию, только по другому назвал - делаю запрос
Код: plsql
1.
2.
3.
4.
5.
6.
[src]SELECT name, abs_translit(
name
)
FROM `product_description`
WHERE `product_id` =504
AND `language_id` =2

[/SRC]

а получаю результат
name abs_translit( name ) Аккумуляторный шуруповерт Ростех АШ 1812 Б2 aaaaaaaaaaaaaa-aaaaaaaaaa-aaaaaa-aa--a-


может кто подскажет в чем проблема (таблица utf8 в функции TEXT CHARSET utf8)
...
Рейтинг: 0 / 0
Транслит функцией
    #39217713
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasil_vasil_делаю запроссмотрите настройки инструмента, которым делаете запрос
...
Рейтинг: 0 / 0
Транслит функцией
    #39262755
Делаю запрос в phpmyadmin: select _fs_transliterate_ru ('русский в транслит') результат: aaaaaaa-a-aaaaaaaa
Помогите разобраться в чем ошибка?
...
Рейтинг: 0 / 0
Транслит функцией
    #39384718
olegs18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasil_vasil_,

Ко всем переменным, где есть текст нужно добавить CHARSET utf8
...
Рейтинг: 0 / 0
Транслит функцией
    #39453515
Dimitry Braverman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно оставлять символы, которые не нужно переводить, например цифры или знаки.
Для этого можно поменять последний IF

IF sub IS NOT NULL THEN
SET res = CONCAT(res, sub);
ELSE
SET res = CONCAT(res, SUBSTR(strlow,i,1));
END IF;
...
Рейтинг: 0 / 0
Транслит функцией
    #39587909
FlameStorm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой скорректированный вариант. Добавил обработку строк с уже существующей латиницей/цифрами плюс замену подчерка и точки на "-", а также исключение повторов минусов "---". Указанные выше поправки по кодировке и длине строки также присутствуют. Проверено в бою.

Код: 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.
52.
53.
54.
55.
56.
57.
DELIMITER $$

DROP FUNCTION IF EXISTS `_fs_transliterate_ru` $$
CREATE DEFINER=`root`@`localhost`
FUNCTION `_fs_transliterate_ru`(str TEXT CHARSET utf8)
  RETURNS text CHARSET utf8
DETERMINISTIC SQL SECURITY INVOKER
  BEGIN
    DECLARE strlow TEXT CHARSET utf8;
    DECLARE sym VARCHAR(3) CHARSET utf8;
    DECLARE prevsub VARCHAR(3) CHARSET utf8;
    DECLARE sub VARCHAR(3) CHARSET utf8;
    DECLARE res TEXT CHARSET utf8;
    DECLARE len INT(11);
    DECLARE i INT(11);
    DECLARE pos INT(11);
    DECLARE alphabeth VARCHAR(37) CHARSET utf8;

    SET i = 0;
    SET res = '';
    SET strlow = LOWER(str);
    SET len = CHAR_LENGTH(str);
    SET alphabeth = ' _.абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

    /* идем циклом по символам строки */

    WHILE i < len DO

      SET i = i + 1;
      SET sym = SUBSTR(strlow, i, 1);
      SET pos = INSTR(alphabeth, sym);

      /*выполняем преобразование припомощи ф-ии ELT */

      IF sym >= '0' AND sym <= '9' OR sym >= 'a' AND sym <= 'z' OR sym = '-' THEN
        SET sub = sym;
      ELSE
        SET sub = elt(pos, '-', '-', '-',
                    'a','b','v','g', 'd', 'e', 'yo','zh', 'z',
                    'i','j','k','l', 'm', 'n', 'o', 'p', 'r',
                    's','t','u','f', 'h', 'c','ch','sh','sch',
                    '', 'y', '','e','yu','ya');

      END IF;

      IF sub IS NOT NULL AND NOT(sub = '-' AND prevsub = '-') THEN
        SET res = CONCAT(res, sub);
      END IF;

      SET prevsub = sub;

    END WHILE;

    RETURN res;
  END $$

DELIMITER ;
...
Рейтинг: 0 / 0
Транслит функцией
    #39587914
FlameStorm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забавно, только опубликовав тут увидел не мешавший выполнению функции косяк, точку не в той раскладке поставил, получив лишнюю "ю".
Вот тут:
Код: sql
1.
    SET alphabeth = ' _юабвгдеёжзийклмнопрстуфхцчшщъыьэюя';


Замените на
Код: sql
1.
    SET alphabeth = ' _.абвгдеёжзийклмнопрстуфхцчшщъыьэюя';



Надеюсь мой ответ поможет ещё кому сэкономить время.

Спасибо авторам выше: aMacedonian, miksoft, сообщившим про "aaaa" (на одном из серверов я тоже увидел "aaaa") и фиксу от olegs18 а также идеи развития функции от Dimitry Braverman.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транслит функцией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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