A NULL rendszám... :)

 ( Swifty | 2019. augusztus 14., szerda - 11:40 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

érdemes lenne megpróbálkoznia a név változtatással is :P


[új] - No rainbow, no sugar - [új]

Tegye fel a kezet, aki dolgozott mar olyan rendszeren, ahol a "NULL" string eseten az oszlop NULL-kent akart beirodni a db-be - fuggetlenul attol, hogy a column NOT NULL volt-e. :)

En nem.

Legtobb retek megkoveteli quote -ot, tehat meg veletlenul sem olyan konnyu elkovetni,
mint az xkcd-s esetet.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Olyannal konkrétan nem találkoztam, ami a 'NULL' stringet NULL-nak feleltette volna meg, viszont olyannal nagyon is (Oracle Database 11g (?) Express Edition), ami az üres stringet ('') mindenképpen NULL-ként írta be, függetlenül attól, hogy az oszlop NOT NULL volt-e, vagy sem. És mivel a cikk szerint a fickó megkapott minden bírságot, amihez nem tartozott rendszámtábla, így nem tűnik lehetetlennek a felállás, hogy a DB marhasága miatt az üres stringek (nincs rendszám) NULL-ként kerüljenek be, viszont a rendszer marhasága miatt lekérés után hibásan stringgé ('NULL') castolódjanak. (A szutyok scriptnyelvekben ilyesmi elő szokott fordulni.)

De ez csak tipp.

ami az üres stringet ('') mindenképpen NULL-ként írta be
azert nem artana ismerni azt amivel az ember dolgozik, es akkor nem ernek meglepetesek :)

függetlenül attól, hogy az oszlop NOT NULL volt-e, vagy sem
en meg nem talalkoztam olyan Oracle verzioval (8+) ami a NOT NULL oszlopba null erteket irt volna be, csak hibat ir a not null constraint miatt.

> azert nem artana ismerni azt amivel az ember dolgozik, es akkor nem ernek meglepetesek :)

Hát ja. Főleg, ha derült égből seggbebaszásként közli a főnök, hogy megnyertük a kukakula kupakfeltöltő webes játékának a kivitelezését és van egy hetünk összedobni valamit, viszont a DB az Oracle lesz, mert az ő szerverükön kell dolgozni és ők ezt biztosítják. Hogy mi? Sose volt dolgod Oracle-lel? Oldd meg. Így elég nehéz "ismerkedni". :/

> en meg nem talalkoztam olyan Oracle verzioval (8+) ami a NOT NULL oszlopba null erteket irt volna be, csak hibat ir a not null constraint miatt.

Hát nekünk meg ezt csinálta. Lehet, hogy valami beállítási mizéria volt, amiről nekünk gőzünk nem volt, hogy be lehet állítani, de egyfelől a beállításokhoz nem is fértünk hozzá, másfelől meg mint mondtam: mélyvíz volt.

Utolag lehet azon haborogni ami 'feature', de nem sok ertelme, bar ha az ember megkonnyebbul es ha csak ez a cel akkor mar megerte :)
De igy meg mindig az jon le belole, hogy az ember nem tanul az esetbol csak morog hogy 'vacak'.

Feature? Az önkényes '' => NULL megfeleltetés? Hát nekem erre egy másik F-el kezdődő szó jutott eszembe...

Lehet sirni, lehet nevetni, oraclenek a '' null, elfogadni el kell ha dolgozni akarsz/kell vele.

Tény, ha valaki dolgozik vele, akkor azt úgy kell, ahogy kell. Szerencsére azóta nekem nem volt szerencsétlenségem hozzá.

A probléma nem az, hogy nem kezel üres stringeket, hanem hogy szó nélkül alakítja át nullra. Pl. Amazon DynamoDB se kezel üres stringeket, de az hibát dob, ha mégis megpróbálsz üres stringet tárolni.

Nem alakit at semmit, az neki null es kesz :) Ha erre hibat akarsz, ott a not null constraint.

Csakhogy az a baj, hogy a null constraint csak és kizárólag oszlopokra vonatkozik, query-kre nem és az Oracle pedig azokban is behelyettesíti.

Az a query, hogy
SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" = '';
úgy fog valójában lefutni, hogy
SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" = NULL;
és mivel NULL-al nem lehet komparálni, így nulla találatot kapunk. (És egyébként ez így elég vicces, mert az igaz, hogy a NULL az nem érték, hanem állapot, de akkor hogy lehet egy értéket behelyettesíteni egy értékként kezelt állapottal, úgy, hogy a behelyettesített pszeudoértékkel komparálni nem lehet? Ez a felállás ugyanis logikailag azt jelenti, hogy ('' == NULL) && (NULL != ''). Ez hogy a fárasba jött ki?)

Persze lehet mondani, hogy ha üres stringre szűrök, akkor nem ezt kell beírni, hanem azt, hogy
SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" IS NULL;
csakhogy ki mondta, hogy konkrétan üres stringre szűrök? Én egy string változó tartalmára szűrök, ami akár üres is lehet. Ennek megfelelően plusz egy elágazás, hogy ha üres a változó, akkor az egyik lekérést futtassa és NULL állapotra szűrjön, ha meg nem az, akkor meg komparáljon.

És egyébként a mai napig nem kaptam épeszű választ, hogy miért van ez így Oracle-ben. Oké, történelmi okok, kompatibilitás, etc.; nagy kaland volna betenni valahova egyetlen boolean változót, hogy a kompatibilis viselkedés és épeszű viselkedés között váltani lehessen? (És ez a történelmi dolgokra való hivatkozás is csak arra ad - egy egyébként elég gyenge - magyarázatot, hogy miért van még mindig így, de arra nem, hogy anno minek kellett ezt így implementálni...)

Vagy ha már itt tartunk:

var_dump(null == ''); // true
var_dump(null === ''); // false

Nem kell hozzá Orák.

A cikk is arról szól, hogy a csávó gondolt egy nagyot hogy majd okos lesz, de nem volt az.