Existuje limit pro funkci CONCAT? – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Existuje limit pro funkci CONCAT? – MySQL – Fórum – Programujte.comExistuje limit pro funkci CONCAT? – MySQL – Fórum – Programujte.com

 

Radek
~ Anonymní uživatel
133 příspěvků
25. 9. 2014   #1
-
0
-

Zdravím,

mám následující funkci v PHP:

Připojen obrázek.

která generuje JSON z DB pomocí volání concat.

Vše fungovalo roky perfektně, než jeden uživatel vložil do jednoho záznamu v DB data o velikosti více jak asi 24kB. V tu chvíli přestala funkce správně pracovat, přesněji řečeno generoval se špatný JSON formát.

Marně jsem hledal na googlu nějakou informaci a marně jsem o několik řádů nastavoval všemožné limity v konfiguraci MySQL. Nakonec jsem musel celý problém řešit přímo v PHP, což mě nepřijde tak elegantní a i uživatel pozná, že to trvá déle...

Proto se ptám, existuje nějaký limit pro funkci CONCAT?

Díky, R.

PS: dokumentace zde:

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
25. 9. 2014   #2
-
0
-

#1 Radek
Poradil bych ti, ale nejde mi ten obrázek spustit a nemohu přečíst, co je tam napsáno.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
25. 9. 2014   #3
-
0
-

http://dev.mysql.com/doc/refman/5.0/en/char.html

podle toho je limit 65535 .. mozna kdyby to bylo jako nejakej typ unicode, tak by to vyzralo driv.. ale teoreticky by se to tam vejit melo

+ i kdybys to delal v php, tak to zase tak o moc pomalejsi nebude... nic co bys poznal (hlavne to ani nemusis spojovat, staci to vypisovat spravne)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
25. 9. 2014   #4
-
0
-
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Radek
~ Anonymní uživatel
133 příspěvků
27. 9. 2014   #5
-
0
-

#2 Kit
Sem liny clovek a kod upravuji pres SSH primo na serveru, proto ten zdrojak v obrazku, abych to nemusel stahovat... Navic to pak neni rozsypane jak caj, kdyz se to nekam kopiruje...

Nahlásit jako SPAM
IP: 90.176.204.–
Radek
~ Anonymní uživatel
133 příspěvků
27. 9. 2014   #6
-
0
-

#3 KIIV
Tabulka je InnoDB a data jsou ulozena jako TEXT, ne jako CHAR nebo VARCHAR...

Text je ve formatu UTF-8, takze pak muze zabirat jeden znak vice bajtu, to ano...

NEMAM PROBLEM S DATY V TABULCE, TY JSOU ULOZENA SPRAVNE, PROBLEM JE PRI EXPORTU DO JSONu...

Co me ale hlava nebere, tak je toto:

CONCAT(

  GROUP_CONCAT(

    CONCAT( ... )

    CONCAT( ... )

    CONCAT( ... )

    ...

  )

)

Jako ze ten vnejsi CONCAT pojme bez problemu 250kB dat (vsechny data z tabulky), ale jakmile je v jednom vnorenem COCNCAT uvnitr GROUP_CONCAT vic jak 24kB, tak se to usekne... Doufam, ze je muj problem (dotaz) spravne polozeny (pochopitelny)...

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
27. 9. 2014   #7
-
0
-

#5 Radek
Právě že takto na mne ten zdroják působí chaoticky. Kdyby to byl text, tak si ho zkopíruji do editoru, přeformátuji, zvětším písmo, barevně zvýrazním podle syntaxe a můžu ho číst.

JSON má určitá specifika a pokud je v uloženém textu nějaký znak, který je pro JSON jako řídicí, tak se ti to celé rozsype. Stačí do textu vložit uvozovky a jsi v loji.

V PHP je na to hezká funkce json_encode(), která se o všechno postará. Proč ji nepoužíváš?

Sem liny clovek a kod upravuji pres SSH primo na serveru, proto ten zdrojak v obrazku, abych to nemusel stahovat... Navic to pak neni rozsypane jak caj, kdyz se to nekam kopiruje...

Běžně edituji kód přes SSH přímo na serveru. Na přetahování kusů kódu používám myš. Levým myšítkem označím na serveru, prostředním myšítkem vložím do formuláře fóra. Jednodušší to snad ani být nemůže. Jsou to jen dvě kliknutí. Pokud máš Windows, tak ještě navíc Ctrl-C a Ctrl-V.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:dc3d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Radek
~ Anonymní uživatel
133 příspěvků
28. 9. 2014   #8
-
0
-

#7 Kit
Používám MC přes SSH a tam to takto kopírovat nejde...

Já se neptám, jak to mám řešit. Mám to dávno vyřešeno jinak...

Ptám se, jestli existuje nějaký limit pro funkci CONCAT v MySQL, obecně, s JSONnem to vůbec nesouvisí...

To jestli píšu  chaotické kódy, je věc názoru a s dotazem to vůbec nesouvisí...

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
28. 9. 2014   #9
-
0
-

#8 Radek
Aha, proto ty mizerné barvičky, kvůli kterým je to pro mne nečitelné. Tvůrci MC mají skutečně divný vkus.

O limitu pro CONCAT() ses tady jistě už dočetl. Kromě toho je to popsáno i v dokumentaci.

V dokumentaci bys jistě našel i funkci CONCAT_WS(), která by se pro tvůj účel hodila mnohem lépe.

Pokud chceš, abychom se ve tvých kódech vyznali, posílej je přes formulář pod tlačítkem "<?". Slouží ke vkládání zdrojových kódů.

Klidně si piš programy jak čuně, ale nebraň druhým, aby si to mohli přerovnat podle obecných zvyklostí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:dc3d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
28. 9. 2014   #10
-
0
-

#8 Radek 

Kód jsem nezkoušel, ale podle mne by to takto bylo mnohem jednodušší:

<?php
class JsonFile {
    private static function createJsanFile() {
        $result = $db->query(<<<SQL
            SELECT
                ID_WEB_DATA AS ID,
                STATUS,
                TYPE,
                USE_OM_BC AS BC,
                PAREMT,
                USER_ID AS USERID,
                DATE_TIME AS DATE,
                LIMK,
                LABEL,
                LABEL_EM AS LABELEM,
                DESCRIPTIOM AS DESCRIPTIOM,
                DESCRIPTIOM_EM AS DESCRIPTIOMEM,
                DATA,
                DATA_EM AS DATAEM
            FROM TWEB_DATA ORDER BY DATE_TIME 
SQL 
        );
        return json_encode($result->fetchall());
    }
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Radek
~ Anonymní uživatel
133 příspěvků
28. 9. 2014   #11
-
0
-

#10 Kit
Ano, uz jsem to prepsal do PHP jeste pred polozenim tohoto dotazu zde...

Ale puvodni reseni nad SQL slapalo o neco rychleji...

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
28. 9. 2014   #12
-
0
-

#11 Radek
Snad tě uklidní, že kdysi jsem to dělal také tak (místo JSON jsem generoval HTML) a také jsem to úplně stejně schytal od komunity. Dnes už vím, že ty vrstvy aplikace zachovávat musím.

Jen mi není jasné, proč došlo ke ztrátě výkonu. Možná proto, že ta funkce to dělá pořádně, bez kompromisů.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Radek
~ Anonymní uživatel
133 příspěvků
28. 9. 2014   #13
-
0
-

#12 Kit
S tim kopirovanim si mel pravdu, viz root...

Tak obecne by mela byt DB lepe optimalizovana na podobne operace, nez PHP, ne?

Ale treba se pletu a navic jsem neprovadel zadna konkretni mereni a prumerovani casu, takze se vlastne neni o cem bavit, je to jen muj pocit, ze je to asi 2x pomalejsi...

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
28. 9. 2014   #14
-
0
-

#13 Radek
Ne tak docela. Některé operace běží v PHP velmi svižně, protože jsou napsány v C/C++. Pomalé bývají cykly, proto se jim vyhýbám, jak jen to jde - agregačních funkcí je v PHP hromada.

Čísla raději zpracovávám přímo v DB, zejména finance. Datum a čas podobně. Lokalizaci si však nechávám až na výstupní šablonu nebo dokonce až na klienta. Agregaci dat do stringů dělám v PHP a v poslední době i v XSLT, které mě ohromilo svým výkonem. 

Na JSON však nic lepšího než json_encode() neznám.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Radek
~ Anonymní uživatel
133 příspěvků
28. 9. 2014   #15
-
0
-

#14 Kit
OK, ja nejsem DB guru...

Ale rozhodne ted uz bych se tolik nehrnul do podobnych "vychytavek" na strane DB,

driv jsem mel pocit ze je DB na podobne veci vice nez vhodna, sem tam jsem si udelal i nejakou DB proceduru...

Nahlásit jako SPAM
IP: 90.176.204.–
Kit+15
Guru
28. 9. 2014   #16
-
0
-

#15 Radek

V DB se dá dělat spousta dobrých vychytávek, ale před použitím vložené procedury je nutné si to 2× rozmyslet. Nedávno jsem v proceduře dělal stavový automat a bylo to mnohonásobně rychlejší než v PHP. Hlavně kvůli tomu, že jsem nemusel z DB stahovat cca 100k záznamů, ale jen jeden výsledný.

Na druhou stranu v PHP velmi dobře a rychle fungují funkce implode(), array_map(), array_reduce(),... které se na spojování výsledků hodí. Navíc třeba funkce htmlspecialchars() v MySQL svůj ekvivalent nemá. A bez ní je jen otázkou času, kdy na tebe někdo zaútočí přes XSS.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý