Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транслит функцией / 10 сообщений из 10, страница 1 из 1
19.04.2014, 14:48
    #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
19.04.2014, 15:11
    #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
19.04.2014, 15:18
    #38619509
aMacedonian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транслит функцией
Да, с применением CHAR_LENGTH() работает, огромное спасибо!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.04.2016, 00:06
    #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
18.04.2016, 06:10
    #39217713
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транслит функцией
vasil_vasil_делаю запроссмотрите настройки инструмента, которым делаете запрос
...
Рейтинг: 0 / 0
27.06.2016, 10:43
    #39262755
Транслит функцией
Делаю запрос в phpmyadmin: select _fs_transliterate_ru ('русский в транслит') результат: aaaaaaa-a-aaaaaaaa
Помогите разобраться в чем ошибка?
...
Рейтинг: 0 / 0
14.01.2017, 15:06
    #39384718
olegs18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транслит функцией
vasil_vasil_,

Ко всем переменным, где есть текст нужно добавить CHARSET utf8
...
Рейтинг: 0 / 0
16.05.2017, 01:19
    #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
21.01.2018, 19:47
    #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
21.01.2018, 19:58
    #39587914
FlameStorm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транслит функцией
Забавно, только опубликовав тут увидел не мешавший выполнению функции косяк, точку не в той раскладке поставил, получив лишнюю "ю".
Вот тут:
Код: sql
1.
    SET alphabeth = ' _юабвгдеёжзийклмнопрстуфхцчшщъыьэюя';


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



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

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


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