Článek v rubrikách:

»PHP
»MySQL

MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM

Víte jak se chová MySQL k prázdným hodnotám, povinným sloupcům, nenulovým sloupcům, nezadaným hodnotám v insertu apod.? A jak by se měla chovat ORM vrstva? Co by měla kontrolovat před samotným dotazem do databáze, jak moc by měla být abstraktní vůči typu databáze?


Pokud se tady mluví o ORM myslí se tím spíš active records. Nechci řešit něco jako Doctrine a vícekrát jsem se zmínil, že podobným systémům nevěřím hlavně z hlediska optimalizace.

K tématu článku si odpovím hned na první dotaz: Jak moc by měla být ORM vrstva abstraktní vůči typu databáze? Ač se mnou nebude možná řada z Vás souhlasit, tvrdím že ORM (active records vrstva) by měla být maximálně v co možné míře stavěna na konrétní databázi, tedy pokud programuji v mysql tak využiji všech proprietárníh řešeních, které nabízí jako např. SQL_CALC_FOUND_ROWS apod.

MySQL však má spousty dalších specialit a to například způsob jakým nakládá s defaultními, nullovými nebo povinnými hodnotami a jak se k tomu staví pokud v insert dotazu chybí apod. Pro tyto účely jsem si připravil sadu testů, které ilustrují a snad pomohou pochopit nebo ujasnit mechanismy fungování ohledně této věci.

Testovací tabulka

Základem je testovací tabulka, vytvoříme si ji tímto sql dotazem:

  1. CREATE TABLE IF NOT EXISTS `test` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `test_mandatory_varchar` varchar(100) COLLATE utf8_czech_ci NOT NULL,
      `test_mandatory_text` text COLLATE utf8_czech_ci NOT NULL,
      `test_mandatory_int` int(11) NOT NULL,
      `test_notmandatory_varchar` varchar(100) COLLATE utf8_czech_ci DEFAULT NULL,
      `test_notmandatory_text` text COLLATE utf8_czech_ci,
      `test_notmandatory_int` int(11) DEFAULT NULL,
      `test_default_varchar` varchar(100) COLLATE utf8_czech_ci NOT NULL DEFAULT 'DEFAUT HELLO!',
      `test_default_int` int(11) NOT NULL DEFAULT '1000',
      `test_nulldefault_varchar` varchar(100) COLLATE utf8_czech_ci DEFAULT 'DEFAULT HELLO!',
      `test_nulldefault_int` int(11) DEFAULT '1000',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Výsledek je na tomto obrázku test-tabulka.png. Tabulka nemá defaultní sloupce pro text, datový typ TEXT/BLOB nemůže mít natavený default.

Nyní bude následovat série sql dotazů, které se pokouší vkládat data do tabulky za různých okolností, které mohou nastat zejména s použitím nějakého vlastního mapování objektů v databázi.

Výsledek všech dotazů najdete na tomto obrázku test-vysledek.png, co k těmto výsledkům vedlo sledujte v následujících kapitolách.

1. Korektní dotaz podle očekávání (vše se chová jak má)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (1, 'SAY HELLO!', 'SAY HELLO!', 1, null, null, null, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

2. Sloupce s defaultními hodnotami zadané jako NULL

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (2, 'SAY HELLO!', 'SAY HELLO!', 1, null, null, null, null, null, null, null);

Tak tohle zařve na sloupcích test_default_varchar a test_default_int, sloupce nesmí obsahovat null hodnotu o což se pokoušíme. #1048 - Column 'test_default_varchar' cannot be null.

3. Sloupce s defaultními hodnotami nejsou vůbec zadané

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int)
  3. VALUES
  4. (3, 'SAY HELLO!', 'SAY HELLO!', 1, null, null, null);

4. Sloupce s defaultními hodnotami zadané jako prázdný řetězec

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (4, 'SAY HELLO!', 'SAY HELLO!', 1, null, null, null, "", "", "", "");

5. Nepovinné (NULL) hodnoty zadané jako NULL (výchozí NULL)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (5, 'SAY HELLO!', 'SAY HELLO!', 1, null, null, null, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

6. Nepovinné (NULL) hodnoty nejsou vůbec zadané

(výchozí NULL)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (6, 'SAY HELLO!', 'SAY HELLO!', 1, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

7. Nepovinné (NULL) hodnoty zadané jako prázdný řetězec

(výchozí NULL)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (7, 'SAY HELLO!', 'SAY HELLO!', 1, "", "", "", 'SAY HELLO!', 1, 'SAY HELLO!', 1);

8. Povinné (NOT NULL) hodnoty zadané jako NULL (není výchozí hodnota)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (8, null, null, null, null, null, null, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

Pochopitelně to opět zařve #1048 - Column 'test_mandatory_varchar' cannot be null.

9. Povinné (NOT NULL) hodnoty nejsou vůbec zadané

(není výchozí hodnota)

  1. INSERT INTO test
  2. (id, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (9, null, null, null, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

10. Povinné (NOT NULL) hodnoty zadané jako prázdný řetězec

(není výchozí hodnota)

  1. INSERT INTO test
  2. (id, test_mandatory_varchar, test_mandatory_text, test_mandatory_int, test_notmandatory_varchar, test_notmandatory_text, test_notmandatory_int, test_default_varchar, test_default_int, test_nulldefault_varchar, test_nulldefault_int)
  3. VALUES
  4. (10, "", "", "", null, null, null, 'SAY HELLO!', 1, 'SAY HELLO!', 1);

Závěrem

Při stavbě aplikace je potřeba si uvědomit s jakými typy hodnot potřebujeme pracovat.

1. Povinná hodnota

Povinná hodnota je naprosto legitimní potřeba a jak se zdá na úrovni mysql toto omezení nelze zajistit! Když například potřebujeme evidovat zákazníky nebo produkty, tak název produktu nebo jméno zákazníka je hodnota bez které data nemají význam a musí být zadána nezávisle na okolnostech. V mysql můžeme pouze nastavit, že hodnota nesmí být typu NULL a že neexistuje výchozí (defaultní) zadání, což lze chápat jako, že hodnota je povinná.

Nicméně příklad 9 ilustruje, že pokud do insert dotazu tyto sloupce vůbec nezadáme, pak se vloží jako prázdný údaj, není vyhozena žádná chyba, ale výsledek je stejný jako v případě vložení prázdných řetězců. Pravděpodobně záleží na nastavení modu mysql, existuje i jakýsi strict mode, nicméně nemám s ním zkušenosti a je otázka jestli s takovým nastavením můžeme manipulovat nebo dokonce chceme.

Tato chyba se typicky vyskytne v případě pokud se snažíme o nějaký způsob mapování objektů na databázi, tyto objekty obvykle generují sql dotazy podle toho, co bylo objektu nastaveno.

  1. $customer=new Customer();
  2. $customer->name="MY NAME";
  3. $customer->insert();

1. Pokud, tedy programujeme vlastní ORM nebo jakoukoli vlastní podobu něčeho takového, měl by tento objekt sledovat při ukládání (updatu), zda se jedná o MANDATORY vlastnost (name), zda se jedná o vlastnost s povolenou NULL hodnotou? Znamená MANDATORY vlastnost, že NULL není relevantní?

2. Jak tedy nastavovat vlastnosti takových objektů? Měli bychom nastavit tři hodnoty? Mandatory, nullable, notempty?

Souvisí to s rozšiřováním tabulky v mysql, pokud je hodnota povinná a nesmí být nullová, pak by nebylo možné klasickým způsobem tabulku v mysql rozšířit o takový sloupec. Pokud tabulka je naplněna daty a chtěli bychom takový sloupec přidat, je nutné mu nastavit defaultní hodnotu (mysql si pomáhá prázdnou hodnotou), kterou budou všechny řádky tohoto nového sloupce vyplněny, aby byla data v tabulce stále konzistentní.

2. Defaultní hodnota

V případě, že sloupce se insertu vůbec neúčastní, pak se použije defaultní hodnota.

1. Je tedy potřeba, aby objekt v ORM vracel defaultní hodnotu? Nebo to necháme na databázi? S objektem je možné pracovat dále, chceme, aby např. funkce __toArray vrátila i defaultní hodnoty? Pokud je vlastnost prázdná, asi by měla zůstat prázdná a defaultní hodnota nás nezajímá. Má tedy defaultní hodnota v ORM vůbec smysl? Pokud není vlastnost vyplněna mělo by to hodit vyjímku nebo defaultní hodnotu?

Jak bude vypadat nastavení takové vlastnosti objektu?

  1. $this->hasColumn("name", "%s", 255, array('mandatory'=>true, 'null'=>false, 'empty'=>false));
  2. $this->hasColumn("isCustomer", "%b", 1, array('default'=>1, 'null'=>false));
  3. $this->hasColumn("adminNote", "%s", 255, array('null'=>true, 'empty'=>true));

Vzniklo tady pár dotazů, co vy na to? Nebude validace na straně objektů zbytečně příliš náročná? Chceme mít možnost ji vypínat? Jak tedy pracovat s prázdnými hodnotami, defaultními nebo povinnými?

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
04.12.2009 01:07 | Anonym (paranoiq) | Položka (Název) nesmí být prázdná

o právě těchhle otázkách už jsem dost přemýšlel. tady je pár mých závěrů:

  1. notempty vlastnost samotná stejně nezaručuje nic. dá se jednoduše oklamat vložením nesmyslného údaje. validace, má-li mít nějaký smysl tedy beztak musí být složitější než pouhé zakázání prázdné hodnoty. ORM za nikoho problémy validity nevyřeší a to ani s pomocí notempty vlastnosti

možnosti je tedy možné redukovat na pouhé dvě – NULL a NOT NULL. přičemž každá hodnota musí projít validací na úrovni modelu, nikoliv na úrovni persistence. zda prázdný řetězec je či není validní není úkol pro persistentní vrstvu, ale pro model

  1. řekněme, že se objekt ukládá metodou save(). ta slouží pouze pro persistenci a NESMÍ OVLIVŇOVAT FUNKČNOST objektu. objekt tedy musí znát defaultní hodnoty v úložišti už při svém vzniku. nelze je načíst později, ať už při uložení nebo při novém načtení v jiné session. musí je znát a vracet ihned. funkce __toArray() tedy musí vracet i defaultní hodnoty pro ty sloupce, které nebyly dosud v modelu nastaveny

jednoduchým řešením je nepoužívat defaultní hodnoty na straně úložiště, ale zavádět je v modelu (třeba v konstruktoru). to navíc podporuje i polymorfismus, kdy se jednotlivé třídy v db tabulce liší pouze jednou ‚defaultní‘ hodnotou, která se nikdy za života objektu nemění (v podstatě slouží jen jako informace pro továrnu)

04.12.2009 01:22 | Administrátor | Re: Položka (Název) nesmí být prázdná

samozřejmě je nutné řešit validitu na úrovni modelu, ale bavím se tady o základní validitě, kterou může řešit už abstraktní třída objektu v orm, která k tomu ví všechny potřebné údaje (ví co může být empty, default, mandatory), samozřejmě validita je mnohem složitější, ale jde mi o to co ještě je potřeba ošetřovat za např. validním formulářem nette

  • jak jsem ale ukázal v příkladech, něco jako mandatory asi model ošetřovat bude muset, protože mysql to nedělá

bame se ale o konkrétních věcech

  1. defaultní hodnoty, měli by se tedy nastavovat už ve chvíli new Customer?tedy ihned po nějaké metodě setValues nebo podobně se nesetnute hodnoty nastavi na default?
  2. mandatory – jak to myslíš, takový parametr by měl existovat ne? protože jak říkám mysql to neřeší (bohužel mandatory právě jde chápat několika směry a jedním z nich může být prázdná hodnota, kterou mysql dovolí zapsat i pro not null)
04.12.2009 06:19 | Anonym (David Grudl) | Re: Re: Položka (Název) nesmí být prázdná

ad 1) určitě, protože je matoucí:

$customer = new Customer; echo $customer->active; // vypíše NULL $customer->save(); echo $customer->active; // vypíše TRUE

04.12.2009 09:25 | Administrátor | Re: Re: Re: Položka (Název) nesmí být prázdná

1. DEFAULTNÍ HODNOTY

ok, TEDY ŘENĚME, že už při vytváření nové instance objektu, budou nastaveny defaultní hodnoty, tedy každé volání konstruktoru způsobí iteraci nad všemi definovanými sloupci a nastaví defaultní hodnoty, tam kde mají být

dosud jsem se bránil tomu, protože zpomalení při vytváření 25000 objektů bylo znát, ale to je asi stejně ojedinělý úkol a všechno něco stojí

? V tomto případě mi nastavení databáze a kombinace NULL a DEFAULT přijde nesmyslná? k tomu přece nikdy nedojde?

04.12.2009 11:04 | Anonym (Jakub Vrána) | Re: Re: Re: Re: Položka (Název) nesmí být prázdná

Hodnota DEFAULT se dá použít i explicitně, např. SET jmeno = DEFAULT. Využitelná je tedy i u NULL sloupců.

05.12.2009 16:45 | Anonym (starenka) | Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

diky, to jsem nevedel

04.12.2009 11:24 | Administrátor | Re: Re: Re: Položka (Název) nesmí být prázdná

S těmi defaultními hodnotami je jiný problém, pokud by to bylo opravdu tak, že při vytváření instance nastavím hodnoty na default, pak bude problém při vykonání pouhého updatu.

Mám formulář, který např. pouze nastavuje, jestli má zákazník přijímat newsletter, nebo nastavuje jen heslo, tedy chci upravit jen hodnotu password.

V takovém případě by nebylo možné udělat.

$c=new Customer(); $c->ID=5; $c->password=„heslo“; $c->save(); protože by to updatovalo na default hodnoty!

v opačném případě bych musel vždy načít obsah objektu z databáze před jeho uložením

což je dost značný problém pokud např. z nějakého xml upravuji 40000 řádků stylem, že chci upravit jen cenu, tedy potřebuji

$p=new Product(); $p->ID=56; $p->salesPrice=1024; $p->save();

04.12.2009 14:18 | Anonym (Jakub Vrána) | Re: Re: Re: Re: Položka (Název) nesmí být prázdná

To je pro mě dost neintuitivní chování. new Customer by podle mě mělo vždy vytvořit nového zákazníka. Když mu nastavím existující ID, tak by uložení mělo skončit chybou. Takže získání stávajícího zákazníka bych dělal třeba metodou Customer::get­ById(). Ta může zákazníka načíst buď hned nebo odloženě až když to bude potřeba (tedy třeba nikdy).

04.12.2009 19:17 | Administrátor | Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

takže navrhuješ při každém updatu objekt nejprve načíst z databáze? to se mi moc nelíbí, hlavně třeba pro hromadné updaty apod.

nebo navrhuješ oddělit nastavení defaultních hodnot od konstruktoru?

i getById() přece musí objekt vytvořit, pokud teda navrhuješ tohle pak by to znamenalo, že budeš nový objekt vytvářet nějak takto

$c=new Customer(); $c->setDefaults(); $c->name=„test“; $c->save();

? nebo jsme se nepochopili?

04.12.2009 21:01 | Anonym (Jakub Vrána) | Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

Klíčový je lazy loading. Defaultní hodnoty nového záznamu si načteš, až když to bude potřeba, stejně tak stávající hodnoty existujícího.

05.12.2009 19:56 | Administrátor | Re: Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

OK díky, za názor, jestli jsem to dobře pochopil odporujete si s Davidem v tomto (ten naopak lazy loading co se týče default považuje za nevhodný, mimochodem dosud to tak řeším, ale právě je to opravdu zmatečné, v mnoha případech bych logicky očekával to a potřeboval opak a kdykoli se ke kódu vracím po delší době, tak musím přemýšlet jak to autor myslel – není to intuitivní)

05.12.2009 21:48 | Anonym (Jakub Vrána) | Re: Re: Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

Lazy loading znamená, že položka se načte, až když je potřeba. Takže se s Davidem shodneme. $customer->active vypíše skutečnou hodnotu nezávisle na uložení, ale načte se jen když je potřeba.

06.12.2009 11:58 | Administrátor | Re: Re: Re: Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

Ujasněme si to:

1. bavíme se stále o DEFAULT, měl by být nastaven už při vytváření nového objektu?

a. David říká, že ano b. Jakub říká, že …

06.12.2009 23:24 | Anonym (Jakub Vrána) | Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

Jakub říká, že ano, pokud se k němu někdo pokusí přistoupit. Takže se nenačítá, dokud to není potřeba.

07.12.2009 17:12 | Administrátor | Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Re: Položka (Název) nesmí být prázdná

diskuse se už moc rozšiřuje a tak ji přesunu k tomuto článku http://www.webfaq.cz/…ovani-clanku

04.12.2009 08:57 | Anonym () | Re: Re: Položka (Název) nesmí být prázdná

„jak jsem ale ukázal v příkladech, něco jako mandatory asi model ošetřovat bude muset, protože mysql to nedělá“ ano. model to bude muset dělat. DB vrstva samotná ale není model. pokud se sem zavede nějaké omezení navíc (třebas notempty), jen to modelu zkomplikuje práci s databází a žádnou skutečnou přidanou hodnotu to mít nebude

  1. alias 2) ano. to jsem napsal výše :]
  2. mandatory == NOT NULL
04.12.2009 09:30 | Administrátor | Re: Re: Re: Položka (Název) nesmí být prázdná

2. MANDATORY

Tedy navrhuješ, že ORM by mělo kontrolovat a vyhazovat vyjímku v případě, že vlastnost objektu je mandatory?

  1. Ovšem jak MANDATORY chápat, někdy je nesmyslné, aby prošla i prázdná hodnota. A je to dle mého už omezení databáze, ale to ostatně je i délka řetězce apod.
  2. Kombinace DEFAULT a MANDATORY je tedy také nesmyslná ne? Pokud se tedy DEFAULT vytvoří už při vytovření instance, tak abych mohl uplatnit omezení nebo ho vůbec testovat, platí to jen pro případ, že později hodnotě nastavím null?
05.12.2009 18:05 | Anonym (paranoiq) | Re: Re: Re: Re: Položka (Název) nesmí být prázdná

to jsem sice neřekl, ale je to tak. při nevyplnění povinného údaje (který nemá defaultní hodnotu), by mělo ‚ORM‘ vyhodit výjimku

ad a) já ho chápu tak jak jsem napsal – MANDATORY == NOT NULL. na každém povinném sloupci by někde ve vyšší úrovni měl být nějaký validátor. pokud je jedinný požadavek na hodnotu, aby tam bylo vyplněno ‚něco‘ (=notempty), tak bude výsledek k ničemu. uživatelé tam nacpou ‚cokoliv‘ aby to prošlo ad b) ano. nesmyslná. má-li něco výchozí hodnotu, tak ji to má proto, aby se použila při nevyplnění

04.12.2009 03:44 | Anonym (kaja47) | __NAME?__

Souhlasím s tím, že by ORM vrstva měla být co nejtenčí a zaměřená na konkrétní databázi.

Jenom k zmíněnému SQL_CALC_FOUN­D_ROWS: věci můžou být komplikovanější než se může zdát viz: http://url.k47.cz/1241

04.12.2009 09:34 | Administrátor | Re: __NAME?__

to asi nebude tak jednoduché, já sem s tím zatím spokojen, používám to na řadě projektů, s vysokou návštěvností a složitými dotazy na celkem rozsáhlých tabulkách a funguje to bez problémů, používám to ke stránkování, výhodou je, že mohu vzít jakkoli složitý dotaz a tím že ho strčím do stránkovací factory tak ho mám nastránkovaný, každopádně tohle bude asi jiná pohádka

04.12.2009 09:07 | Anonym (paranoiq) | __NAME?__

nj. ale jaké jsou alternativy? :] spouštět navíc COUNT(*) kvůli zjištění počtu řádků také není úplně levná záležitost

pekelně rychlé je to pouze na MyISAM, bez JOINů a bez WHERE http://dev.mysql.com/…nctions.html#…

04.12.2009 11:02 | Anonym (Jakub Vrána) | Re: __NAME?__

Bohužel COUNT() rychlejší než SQL_CALC_FOUND_ROWS prakticky vždy je. Pokud je nad počítanými daty index, tak je to rychlé i s WHERE. Nejvíce se zrychlení projeví, když se z dotazu COUNT() podaří vyhodit tabulky, které pro zjištění počtu nejsou potřeba (vazby 1:1 LEFT JOIN nebo INNER JOIN na vždy existující hodnotu).

05.12.2009 18:09 | Anonym (paranoiq) | Re: Re: __NAME?__

tak to bych opravdu nečekal. díky

05.12.2009 10:56 | Anonym (Leoš Ondra) | SQL mode

Neliší se náhodou chování v MySQL5 podstatně podle nastavení proměnné sql_mode? Konkrétně pokud mám sloupec s not null a nic do něj nevložím a nemám definovanou default hodnotu… Leo

05.12.2009 19:51 | Administrátor | Re: SQL mode

o sql mode píši v článku také, ale podle mne jsou mizivé šance pro 99% lidí tohle nějak ovlivnit,

stejně tak ani když mám vlastní server bych si nedovolil změnit sql mode kvůli 10projektům,

protože dalších 90 by mohlo přestat fungovat!

nebo se mílím, že taková změna, pokud nejde o stavění serveru přímo na míru dané aplikace je nemožná?

05.12.2009 21:44 | Anonym (Jakub Vrána) | Re: Re: SQL mode

Proměnná sql_mode je nastavitelná i pro připojení, podobně třeba jako kódování. Takže si ji každý projekt může nastavit podle potřeby.

06.12.2009 11:47 | Administrátor | Re: Re: Re: SQL mode

tak to je jiná to jsem nevěděl, máte s tím někdo zkušenost, nicméně je to až tak rozhodující, pro to co by měl jednoduchý ORM umět?

20.12.2009 12:20 | Anonym (PHX) | DB Error

Je nezbytne aby se tohle resilo v ORM? Vzdyt to resi DB. Ja jsem vzdycky zavolal save() a bud to proslo nebo vyskocila vyjimka (zaobalena DB chyba). Jediny problem je v tom, ze clovek pak nevi co je spatne (leda nejak parsovat text chyby).

20.12.2009 20:22 | Administrátor | Re: DB Error

DB to právě neřeší, kdyby vyskakovala chyba bude určitě mít svoje číslo, záleží na sql_mode jestli máme možnost měnit, jinak mysql striktně tyto chyby nevyhazuje

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>