ugrás a tartalomhoz

MSQL like nem talál ékezetes json-t

gtoma · 2014. Szep. 16. (K), 15.54
Sziasztok!

A mysql egyik oszlopában JSON ben tárolok adatokat.
Az ékezetes karaktereket ugye kódolja, a "normált" nem.

Sajnos a keresés nem jól működik, mert az ékezetes karaktereket, amit ugye kódolt, azt nem találja. Amiben nincs ékezet, azt igen:

Tehát a Tesztem szónál:
Tárolva: ["Tesztem"]
keresés: where ( `labels` like '%"Tesztem"%' )

van találat, de a Tésztám:
Tárolva: ["T\u00e9szt\u00e1m"]
Keresés: where ( `labels` like '%"T\u00e9szt\u00e1m"%' )
nincs találat. Van ötlet mi lehet a gond?

előre is köszönöm a segítséget.
 
1

Menekülj!

Hidvégi Gábor · 2014. Szep. 16. (K), 16.58
Nem lehet, hogy a \ jellel van gond? Nem kéne escape-elni?
2

:) Érteni szeretném inkább.

gtoma · 2014. Szep. 16. (K), 17.30
Nem, anélkül is próbáltam, de egyébként meg ugye, mikor nézem phpmy admin, akkor ott a \ jel.

Tárolhatnám serialize állapotban is, ha nincs megoldás az lesz, csak jó lenne érteni, miért nem találja. :D
4

Escape=menekül angolul. Gábor

H.Z. · 2014. Szep. 17. (Sze), 10.30
Escape=menekül angolul. Gábor erre célzott valószínűleg :)
3

Aki keres az talál :). Sok

szabo.b.gabor · 2014. Szep. 17. (Sze), 10.20
Aki keres az talál :).

Sok sok backslash kell.
5

Próbáltam tegnap, de nekem

Hidvégi Gábor · 2014. Szep. 17. (Sze), 10.35
Próbáltam tegnap, de nekem nem sikerült, pedig nem sajnáltam sok-sok darab visszavágást sem beszúrni. Olyat is olvastam, hogy a mező típusát, amiben a json adatokat tároljuk, állítsuk (VAR)BINARY-ra, de nekem ez sem segített.
6

Egy tanács: relációs

bamegakapa · 2014. Szep. 17. (Sze), 10.41
Egy tanács: relációs adatbázisban ne tárolj JSON-ban adatokat. Kivéve, ha tényleg csak tárolod, tehát nem akarsz rá feltételt írni, rendezni, stb.

A labeleknek gyanúsan külön tábla dukálna, a kapcsolat jellegétől függően akár kapcsolótáblával. Nem csak kevesebb szopás (ha az ember egyszer rászánja az időt, és megtanulja a join-t használni), de ráadásul még indexelhető is lesz.
7

+1

szabo.b.gabor · 2014. Szep. 17. (Sze), 15.39
+1
8

(Remélem nem fajul ez is

kuka · 2014. Szep. 17. (Sze), 16.32
(Remélem nem fajul ez is technológiák/szervezetek/személyek kampányszerű kritizálásává.)

Csak megjegyezném, hogy a Thunderbird a messages-db.sqlite állomány messages táblájának jsonAttributes mezejében JSON formátumú karakterláncot tárol. Nem bogarásztam át a forráskódját, de meglehetősen biztos vagyok benne, hogy nem csak tárolásra használják, mivel eddigi kutakodásaimból úgy tudtam meg, hogy a levelek állapota (új, olvasatlan, …) csak onnan tudható meg.

Én a nem-tárolási tanácsot annyiban módosítanám, hogy szerintem a belső feldolgozás is rendben van. Azaz tárolt eljárással, vagy SQLite esetén regisztrált függvénnyel.
9

PostgreSQL

Hidvégi Gábor · 2014. Szep. 17. (Sze), 16.45
Érdemes elolvasni. Persze az, hogy van erre lehetőség, még nem jelenti azt, hogy használni kell (nem tudom, mennyire gyors, a stack overflow bejegyzése szerint nem rossz a sebessége, mert indexelhető a json típusú mező).
10

Danke

bamegakapa · 2014. Szep. 17. (Sze), 22.25
Limitált tudásom kiütközött a témában, SQLite-hoz bevallom még nem nyúltam, Postgréhez már igen régen. Köszönöm a felvilágosítást.

Tanácsomat úgy módosítanám, hogy MySQL esetén ne tárolj JSON-ban adatokat, ha azokra feltételt, rendezést, stb. (bármit sima kiolvasáson kívül) akarsz alkalmazni. Más motorok esetén is előbb tájékozódj, hogy érdemes-e.
11

Megannyi angol lord társalog itt

szabo.b.gabor · 2014. Szep. 17. (Sze), 23.23
Megannyi angol lord társalog itt a weblaboron :D
12

Kedvencem az announce meg a

bamegakapa · 2014. Szep. 18. (Cs), 00.04
Kedvencem az announce meg a splendid :D.

Fasza.
13

Elnézést, lebetegedtem.

gtoma · 2014. Szep. 20. (Szo), 07.24
Elnézést, dögrováson voltam, nem a témát hanyagoltam. :)

Escape: Végül én is rájöttem, a kapcsolatra. Vegyük úgy hogy szándékos félreértés volt, és vicceltem. :D

A válaszokat nagyon köszönöm, szabo.b.gabor -nak részben igaza volt.
ugyan én kerestem, de nem találtam, ő viszont megtalálta a megoldást.
Az alább láthatjátok:
$s[] = "`labels` like '%".str_replace('\\', '\\\\\\\\', json_encode($sor))."%'";
sql eredmény:
`labels` like '%"T\\\\u00e9szt\\\\u00e1m"%'

Ez működik.

Talán másnak is hasznos lesz az infó. :)