Portál AbcLinuxu, 8. května 2025 14:15

Dotaz: Postgresql, Oracle, MSSQL -> mysql: bool sloupec

27.12.2010 19:42 koqror
Postgresql, Oracle, MSSQL -> mysql: bool sloupec
Přečteno: 618×
Odpovědět | Admin
Ahoj. Importuju data z různých databází do mysql. Samozřejmě to nedělám přímo já, ale napsal jsem si skript v php. Problémem může být to, že mysql ukládá bool jako tinyint(1), zato třeba postgresql má bool a vrací podle manuálu t nebo f při selectu. Takže pak to dopadá tak, že do mysql vkládám do sloupce tinyint text 't' nebo 'f'. Otázka zní: jak mám na straně mysql překládat f a t do 1 nebo 0? Mysql zvládá TRUE nebo FALSE jako 1 a 0, ale t a f neví co je.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.12.2010 20:43 koqror
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem si myslel že bych udělal v mysql trigger
DELIMITER $$

CREATE TRIGGER tr_tabulka_update BEFORE UPDATE ON tabulka
FOR EACH ROW BEGIN
	IF (NEW.enabled = 1 OR NEW.enabled LIKE 'true' OR NEW.enabled LIKE 't') THEN
		SET NEW.enabled = 1;
	ELSE
		SET NEW.enabled = 0;
	END IF;
END;$$

DELIMITER ;
ale nefunguje a píše warning, takže se zdá že mysql kontroluje hodnotu "enabled" ještě před spuštěním triggeru a do triggeru už se dostane nějak ořezaná...
okbob avatar 27.12.2010 20:52 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
A co to z PostgreSQL rovnou číst jako integer?
postgres=# select true::int, false::int;
 int4 | int4 
------+------
    1 |    0
(1 row)
Případně, pokud máte starší verzi pg
postgres=# CREATE OR REPLACE FUNCTION to_int(boolean) RETURNS int AS $$ SELECT CASE WHEN $1 THEN 1 ELSE 0 END $$ LANGUAGE sql;

postgres=# SELECT to_int(true), to_int(false);
 to_int | to_int 
--------+--------
      1 |      0
(1 row)
27.12.2010 21:26 koqror
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
To je ale zase postgresql specifické a nebude to fungovat pro ostatní RDBMS. Nemám sice ještě odzkoušené ostatní RDBMS, ale předpokládám, že ty budou vracet t, f, true, false, 1 nebo 0 pro bool. Možná bude nejjednodušší použít pro bool v mysql char(1) + trigger který zajistí hodnotu vždy 1 nebo 0.
27.12.2010 23:02 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
Nebo:
$value = mysqli_real_escape_string($value); 
$sql="…mysql_bool_field = CASE '$value' WHEN '0' THEN 0 WHEN 'f' THEN 0 ELSE 1 END…"
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
28.12.2010 00:03 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
urob si export view v kazdej db do datovych typov v mysql
okbob avatar 28.12.2010 06:35 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
SELECT CASE WHEN sloupec THEN 1 ELSE 0 END, ... 
To je naprosto podle standardu.
27.12.2010 22:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Postgresql, Oracle, MSSQL -> mysql: bool sloupec
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možná nerozumím otázce, ale:
MySQL má bool jak tinyint(1) (což jste i napsal) a hodnotu 0 považuje za false a cokoliv jiného za true (dobrým zvykem je vkládat jedničku, pokud tedy typ bool používáte).
Protože pg_XXX vrací v případě boolean typu 't' a 'f' a ne PHP true a false, musíte s touto skutečností pracovat a to buď na úrovni PHP po select-u (což bych udělal já), nebo při vkládání do MySQL (něco jako "`bool_field`=CASE WHEN '$value'='f' THEN 0 ELSE 1 END CASE").
Když se na to podíváte z pohledu toho, že máte různé vstupy JDETE pře PHP a pak máte jednotný výstup, tak Vás může napadnout to, že mezivrstva, která to propojuje je PHP, tudíž bych vše převedl na PHP typy (ne nutně na PHP zákládní typy a klidně na nějaký objek) kde by, v těchto případech, vkládání hodnoty prošlo dle vstupu (PostgreSQL) závislou transformací. No a výstup do MySQL už je pak jednotný, je to transformace z PHP typů do MySQL - vždy stejná.
Na rozhraní čtení můžete mít kontroly co čtete a když se narazí na nějaký neznámý typ, tak se to přeruší a bude třeba zasáhnout a doplnit informaci jeli to třeba na vstupu transformovat.
PS: bacha na to, že 64bit integer (bigint) je vracen jako string a na reálné číslo (PHP float) jej nemůžete bezpečně konvertovat.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.