SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.07.2009 06:58:28

temp00ff
Участник
Зарегистрирован: 08.07.2009
Сообщений: 2

Проблема с кодировкой в функции

Талица состоит из 3-х полей id, full_name, email. БД в кодировке cp1251, таблица тоже. Проблема в том, что некоторые значения full_name с опечатками, т.е. некоторые символы в кириллице заменены аналогичными латинскими символами. Например, "Ивaн", здесь 3-я буква 'a' - латинская. Необходимо из таблицы сделать выборку строк с такими опечатками.
Написал функцию по поиску латинских символов в строке (за код не ругайте smile):


SET NAMES cp1251;
DELIMITER $$

DROP FUNCTION IF EXISTS `ub`.`cyr_chars`$$
CREATE DEFINER=`root`@`localhost` FUNCTION  `ub`.`cyr_chars`(str VARCHAR(100)) RETURNS INT(11)
BEGIN
  DECLARE len INT;
  DECLARE idx INT DEFAULT 1;
  DECLARE ret INT DEFAULT 0;

  SET len = CHAR_LENGTH(str);

  WHILE (idx <= len) DO
    IF ( ((SUBSTRING(str, idx, 1) >= 'a') AND (SUBSTRING(str, idx, 1) <= 'z')) OR ((SUBSTRING(str, idx, 1) >= 'A') AND (SUBSTRING(str, idx, 1) <= 'Z'))) THEN
      SET ret = idx;
    END IF;
    SET idx = idx + 1;
  END WHILE;

  RETURN ret;
END;

 $$

DELIMITER ;
 

Но она на отрез отказывается работать с кириллицей. химичил с CONVERT и CAST, но путнего ничего не вышло.
В случае использования кириллицы вылетает warning: Incorrect string value: '\xD1\x84\xD1\x8B\xD0\xB2...' for column 'str' at row 1. на всякий, в качестве клиента использую mysql query browser.

Неактивен

 

#2 08.07.2009 10:59:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Проблема с кодировкой в функции

Ну вообще проблема полечится заменой заголовка на
CREATE FUNCTION `cyr_chars`(str VARCHAR(100) CHARSET cp1251) RETURNS INT(11)

Но зачем так сложно? Кажется, Вашу задачу решит простой
SELECT * FROM tablename WHERE name RLIKE '[a-zA-Z]';

Неактивен

 

#3 08.07.2009 11:22:56

temp00ff
Участник
Зарегистрирован: 08.07.2009
Сообщений: 2

Re: Проблема с кодировкой в функции

Вот спасибо! оба способа работают. про RLIKE я даже и не знал smile.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson