Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z explodem tekstu w funkcji MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
Czadus
Witam, mam problem, stworzyłem funkcję za pomocą której dodając tekst rozdzielony spacjami, zostanie on dodany do bazy danych, każdy wyraz w osobnym rekordzie. Wszystko działa poprawnie, poza rozdzielaniem niektórych wyrazów z polskimi znakami, np. wysyłając treść:

"Hrabia wracał do siebie lecz konia wstrzymywał Głową coraz w tył kręcił w ogród się wpatrywał I raz mu się zdawało".

W stworzonym zapytaniu dodającym kolejne wyrazy do bazy danych, niektóre słowa zostają ucięte:

Kod
INSERT INTO
    ewolon_search_index(`id`,`idSearch`,`word`,`lang`)
VALUES
    ('','1','Hrabia',0),('','1','wracał',0),('','1','siebie',0),('','1','lecz',0),
    ('','1','konia',0),('','1','wstrzymywał',0),('','1','łową',0),('','1','raz',0),
    ('','1','tył',0),('','1','ręcił',0),('','1','ogród',0),('','1','ię',0),
    ('','1','patrywał',0),('','1','raz',0),('','1','się',0),('','1','dawało',0)


Kod
CREATE DEFINER=`root`@`localhost` FUNCTION `_add2Index`(`idArticle` INT, `lang` INT, `text2Index` TEXT)
    RETURNS text
    LANGUAGE SQL
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    DECLARE queryText TEXT;
    DECLARE counter INT;
    
    SET CHARSET utf8;
    SET NAMES `utf8` COLLATE `utf8_polish_ci`;
    
    SET counter = 0;
    SET queryText = "INSERT INTO ewolon_search_index(`id`,`idSearch`,`word`,`lang`) VALUES";
    
    SET @saTail = text2Index;
    
    loop_index: WHILE @saTail!='' DO
        SET @sHead = SUBSTRING_INDEX(@saTail, ' ', 1);
        SET @saTail = SUBSTRING( @saTail, LENGTH(@sHead)+2);
        
        IF LENGTH(@sHead)>2 THEN
            
            IF counter > 0 THEN
                SET queryText = CONCAT(queryText,",('','",idArticle,"','",@sHead,"',",lang,")");
            ELSE
                SET queryText = CONCAT(queryText,"('','",idArticle,"','",@sHead,"',",lang,")");
            END IF;
            
            SET counter = counter + 1;
        END IF;
        
        SET queryText = CONCAT(queryText,@saTail);
    END WHILE loop_index;
    
    RETURN queryText;
END


Szukam i szukam i już nie wiem co jest nietak, wydaje mi się, że wynika to z winy polskich niektórych polskich ogonków. W php treść wygląda poprawnie, jest ona wysyłana postem, wyświetla się tak, jak powinna, przy połączeniu z bazą danych mam ustawione:

"SET NAMES UTF8"

Jak wybrnąć z tego problemu??
Czadus
Ok, funkcja została przeze mnie zupełnie przerobiona. Obecnie, explod oraz przepatrzenie ponad 8000 wyrazów, dodanie do bazy jako osobne rekordy wszystkich dłuższych od 2 znaków, zajmuje 10s lokalnie, na serwerze czas ten będzie jeszcze szybszy. Poniżej kod.

  1. CREATE DEFINER=`root`@`localhost` FUNCTION `_add2Index`(`idArticle2Index` INT, `lang2Index` INT, `title2Index` TEXT, `text2Index` TEXT, `type2Index` INT)
  2. RETURNS longtext
  3. LANGUAGE SQL
  4. DETERMINISTIC
  5. CONTAINS SQL
  6. SQL SECURITY DEFINER
  7. COMMENT ''
  8. BEGIN
  9. DECLARE queryText LONGTEXT;
  10. DECLARE insertText LONGTEXT;
  11. DECLARE counter INT;
  12. DECLARE counterCheck INT;
  13. DECLARE word LONGTEXT;
  14. DECLARE pointer INT;
  15.  
  16. /*dodawanie lub aktualizacja rekordu z trescia w tabeli _search*/
  17. SELECT COUNT(*) INTO counterCheck FROM ewolon_search WHERE idArticle = idArticle2Index AND lang = lang2Index LIMIT 1;
  18.  
  19. IF counterCheck = 1 THEN
  20. UPDATE ewolon_search SET `type`=type2Index,`idArticle`=idArticle2Index,`title`=title2Index,`content`=text2Index,`lang`=lang2Index,`dataEdit`=NOW() WHERE idArticle = idArticle2Index AND lang = lang2Index;
  21. ELSE
  22. INSERT INTO ewolon_search(`id`,`type`,`idArticle`,`title`,`content`,`lang`,`data`,`dataEdit`,`status`) VALUES('',type2Index,idArticle2Index,title2Index,text2Index,lang2Index,NOW(),NOW(),1);
  23. END IF;
  24.  
  25. /*usuwanie starych zindeksowanych tresci danego artykulu*/
  26. DELETE FROM ewolon_search_index WHERE idArticle = idArticle2Index AND lang = lang;
  27.  
  28. /*przygotowanie zmiennych do indeksowania*/
  29. SET counter = 0;
  30. SET queryText = "INSERT INTO ewolon_search_index(`id`,`idArticle`,`word`,`lang`) VALUES";
  31. SET insertText = CONCAT(TRIM(BOTH FROM text2Index), " ", TRIM(BOTH FROM title2Index), " ");
  32.  
  33. /*indeksowanie nowej tresci*/
  34. loop_index: LOOP
  35. SET pointer = LOCATE(' ', insertText, 1);
  36.  
  37. IF LENGTH(insertText)=0 THEN LEAVE loop_index;
  38. END IF;
  39.  
  40. SET word = SUBSTRING(insertText, 1, pointer - 1);
  41. SET insertText = SUBSTRING(insertText,pointer + 1);
  42.  
  43. IF LENGTH(word)>2 THEN
  44. IF counter > 0 THEN
  45. SET queryText = CONCAT(queryText,",('','",idArticle2Index,"','",word,"','",lang2Index,"')");
  46. ELSE
  47. SET queryText = CONCAT(queryText,"('','",idArticle2Index,"','",word,"','",lang2Index,"')");
  48. END IF;
  49.  
  50. SET counter = counter + 1;
  51. END IF;
  52.  
  53. IF counter = 10000 THEN LEAVE loop_index;
  54. END IF;
  55.  
  56. END LOOP loop_index;
  57.  
  58. RETURN queryText;
  59. END
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.