Karazana mampiahiahy

Tsy misy zavatra mampiahiahy momba ny bika aman'endriny. Ambonin'izany, toa mahazatra anao tsara sy efa ela izy ireo. Saingy mandra-pandinihanao azy ireo ihany. Eo no anehoan'izy ireo ny toetrany mamitaka, miasa amin'ny fomba hafa tanteraka noho ny nantenainao. Ary indraindray izy ireo dia manao zavatra izay mampijoro ny volonao - ohatra, very ny angona miafina nankinina taminy. Rehefa mifanatrika amin'izy ireo ianao dia milaza fa tsy mifankahalala izy ireo, na dia ao anatin'ny aloka aza dia miasa mafy ao ambanin'ny satroka iray izy ireo. Tonga ny fotoana hitondrana azy ireo amin'ny rano madio. Andeha hojerentsika koa ireo karazana mampiahiahy ireo.

Ny fanoratana angon-drakitra ao amin'ny PostgreSQL, ho an'ny lojikany rehetra, dia indraindray mampiseho tsy ampoizina hafahafa. Ato amin'ity lahatsoratra ity isika dia hiezaka ny hanazava ny sasany amin'ireo quirks, hahatakatra ny anton'ny fitondran-tena hafahafa sy hahatakatra ny fomba tsy hihazakazaka amin'ny olana amin'ny fanao andavanandro. Mba hilazana ny marina, nanangona ity lahatsoratra ity ho toy ny karazana boky reference ho an'ny tenako ihany koa aho, boky reference izay azo lazaina mora foana amin'ny tranga mampiady hevitra. Noho izany, hofenoina izany rehefa hita ny tsy ampoizina vaovao avy amin'ireo karazana mampiahiahy. Andeha Γ ry, ry mpitady angon-drakitra tsy sasatra!

Dosie laharana voalohany. tena/double precision/numeric/vola

Toa ny karazany nomerika no olana kely indrindra amin'ny resaka tsy ampoizina amin'ny fitondran-tena. Fa na ahoana na ahoana. Andeha Γ ry isika hanomboka amin’izy ireo. Noho izany…

Nanadino ny fomba fanisana

SELECT 0.1::real = 0.1

?column?
boolean
---------
f

Inona no olana? Ny olana dia ny PostgreSQL dia mamadika ny 0.1 tsy voatanisa tsy tapaka ho avo roa heny ary manandrana mampitaha izany amin'ny 0.1 amin'ny karazana tena izy. Ary samy hafa tanteraka ireo dikany! Ny hevitra dia ny maneho ny isa tena izy amin'ny fitadidiana milina. Koa satria ny 0.1 dia tsy azo aseho amin'ny ampahany mimari-droa voafetra (mety ho 0.0(0011) amin'ny binary), ny isa manana halalin'ny bitika samihafa dia tsy mitovy, noho izany dia tsy mitovy izy ireo. Amin'ny ankapobeny dia lohahevitra ho an'ny lahatsoratra mitokana ity, tsy hanoratra amin'ny antsipiriany bebe kokoa eto aho.

Avy aiza ny fahadisoana?

SELECT double precision(1)

ERROR:  syntax error at or near "("
LINE 1: SELECT double precision(1)
                               ^
********** Ошибка **********
ERROR: syntax error at or near "("
SQL-состояниС: 42601
Π‘ΠΈΠΌΠ²ΠΎΠ»: 24

Olona maro no mahafantatra fa ny PostgreSQL dia mamela ny fanamarihana azo ampiasaina amin'ny karazana fanariana. Izany hoe, tsy 1::int ihany no azonao soratana, fa int(1) ihany koa, izay mitovy. Fa tsy ho an'ny karazana misy teny maromaro ny anarany! Noho izany, raha te hanisy sanda isa ianao amin'ny karazana precision avo roa heny amin'ny endrika miasa, ampiasao ny alias amin'ity karazana float8 ity, izany hoe SELECT float8(1).

Inona no lehibe noho ny infinity?

SELECT 'Infinity'::double precision < 'NaN'::double precision

?column?
boolean
---------
t

Jereo hoe manao ahoana izany! Hita fa misy zavatra lehibe kokoa noho ny infinity, ary NaN izany! Mandritra izany fotoana izany, ny antontan-taratasin'ny PostgreSQL dia mijery antsika amin'ny maso mahitsy ary milaza fa ny NaN dia mazava ho azy fa lehibe noho ny isa hafa, ary noho izany dia tsy manam-petra. Mifanohitra amin'izany koa ny -NaN. Salama ry tia matematika! Saingy tsy maintsy tsaroantsika fa izany rehetra izany dia miasa ao anatin'ny tontolon'ny isa tena izy.

Manodidina ny maso

SELECT round('2.5'::double precision)
     , round('2.5'::numeric)

      round      |  round
double precision | numeric
-----------------+---------
2                | 3

Fiarahabana tsy nampoizina indray avy any an-toerana. Averina indray, tadidio fa ny karazana fandrefesana avo roa heny sy ny karazana isa dia manana fiantraikany amin'ny fihodinana samihafa. Ho an'ny numeric - ny fomba mahazatra, rehefa boribory ny 0,5, ary ho an'ny precision avo roa heny - 0,5 dia boribory mankany amin'ny integer akaiky indrindra.

Zavatra miavaka ny vola

SELECT '10'::money::float8

ERROR:  cannot cast type money to double precision
LINE 1: SELECT '10'::money::float8
                          ^
********** Ошибка **********
ERROR: cannot cast type money to double precision
SQL-состояниС: 42846
Π‘ΠΈΠΌΠ²ΠΎΠ»: 19

Araka ny PostgreSQL, ny vola dia tsy tena isa. Araka ny filazan'ny olona sasany koa. Tokony hotadidintsika fa ny fandatsahana ny karazana vola dia azo atao amin'ny karazana numeric ihany, toy ny karazana numeric ihany no azo alefa amin'ny karazana vola. Fa ankehitriny ianao dia afaka milalao izany araka izay irin'ny fonao. Fa tsy hitovy ny vola.

Smallint sy sequence generation

SELECT *
  FROM generate_series(1::smallint, 5::smallint, 1::smallint)

ERROR:  function generate_series(smallint, smallint, smallint) is not unique
LINE 2:   FROM generate_series(1::smallint, 5::smallint, 1::smallint...
               ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.
********** Ошибка **********
ERROR: function generate_series(smallint, smallint, smallint) is not unique
SQL-состояниС: 42725
Подсказка: Could not choose a best candidate function. You might need to add explicit type casts.
Π‘ΠΈΠΌΠ²ΠΎΠ»: 18

PostgreSQL dia tsy tia mandany fotoana amin'ny zavatra kely. Inona avy ireo filaharana mifototra amin'ny smallint? int, tsy latsaka! Noho izany, rehefa manandrana manatanteraka ity fanontaniana etsy ambony ity, ny angon-drakitra dia manandrana manipy smallint amin'ny karazana integer hafa, ary mahita fa mety ho maromaro izany. Iza no mpilalao hofidiana? Tsy afaka manapa-kevitra an'izany izy, ary noho izany dia nianjera tamin'ny fahadisoana.

File laharana faharoa. "char"/char/varchar/text

Misy karazana hafahafa ihany koa amin'ny karazana toetra. Andeha hofantarintsika koa izy ireo.

Karazana hafetsena inona ireo?

SELECT 'ΠŸΠ•Π’Π―'::"char"
     , 'ΠŸΠ•Π’Π―'::"char"::bytea
     , 'ΠŸΠ•Π’Π―'::char
     , 'ΠŸΠ•Π’Π―'::char::bytea

 char  | bytea |    bpchar    | bytea
"char" | bytea | character(1) | bytea
-------+-------+--------------+--------
 ╨     | xd0  | П            | xd09f

Karazana "char" inona ity, karazana clown inona ity? Tsy mila an’ireo isika... Satria mody atao hoe char tsotra, na dia ao anaty teny nalaina aza. Ary tsy mitovy amin'ny char mahazatra izy io, izay tsy misy teny nalaina, satria ny byte voalohany amin'ny fanehoana tady ihany no avoakany, fa ny char mahazatra kosa dia mamoaka ny toetra voalohany. Amin'ity tranga ity, ny endri-tsoratra voalohany dia ny litera P, izay ao amin'ny fanehoana unicode dia maka 2 bytes, araka ny asehon'ny fanovana ny valiny amin'ny karazana bytea. Ary ny karazana "char" dia maka ny byte voalohany amin'ity fanehoana unicode ity. Koa nahoana no ilaina io karazana io? Ny antontan-taratasy PostgreSQL dia milaza fa karazana manokana ampiasaina amin'ny filana manokana. Ka azo inoana fa tsy mila izany isika. Jereo anefa ny masony dia tsy ho diso hevitra ianao rehefa mifanena aminy amin’ny toetrany manokana.

Espace fanampiny. Tsy hita maso, tsy ao an-tsaina

SELECT 'abc   '::char(6)::bytea
     , 'abc   '::char(6)::varchar(6)::bytea
     , 'abc   '::varchar(6)::bytea

     bytea     |   bytea  |     bytea
     bytea     |   bytea  |     bytea
---------------+----------+----------------
x616263202020 | x616263 | x616263202020

Jereo ny ohatra nomena. Navadiko manokana ho karazana bytea ny vokatra rehetra, mba ho hita mazava tsara izay tao. Aiza ny toerana misy azy aorian'ny fandefasana ny varchar(6)? Ny antontan-taratasy dia milaza amin'ny fomba fohy hoe: "Rehefa manipy ny sandan'ny tarehin-tsoratra amin'ny karazana endri-tsoratra hafa, dia ariana ny espace fotsy manaraka." Tsy maintsy tsaroana io tsy fitiavana io. Ary mariho fa raha apetraka mivantana amin'ny karazana varchar(6) ny tady voatonona, dia voatahiry ny habaka manaraka. Toy izany ny fahagagana.

File laharana fahatelo. json/jsonb

JSON dia rafitra misaraka izay miaina ny fiainany manokana. Noho izany, ny entiny sy ny an'ny PostgreSQL dia hafa kely. Ireto misy ohatra.

Johnson sy Johnson. mahatsapa ny fahasamihafana

SELECT 'null'::jsonb IS NULL

?column?
boolean
---------
f

Ny zava-misy dia ny JSON dia manana ny entiny tsy misy dikany, izay tsy mitovy amin'ny NULL ao amin'ny PostgreSQL. Amin'izay fotoana izay ihany, ny zavatra JSON dia mety manana ny sanda NULL, ka ny teny SELECT null::jsonb IS NULL (mariho ny tsy fisian'ny teny tokana) dia hiverina marina amin'ity indray mitoraka ity.

Ny litera iray dia manova ny zava-drehetra

SELECT '{"1": [1, 2, 3], "2": [4, 5, 6], "1": [7, 8, 9]}'::json

                     json
                     json
------------------------------------------------
{"1": [1, 2, 3], "2": [4, 5, 6], "1": [7, 8, 9]}

---

SELECT '{"1": [1, 2, 3], "2": [4, 5, 6], "1": [7, 8, 9]}'::jsonb

             jsonb
             jsonb
--------------------------------
{"1": [7, 8, 9], "2": [4, 5, 6]}

Ny zava-misy dia ny json sy jsonb dia rafitra samy hafa tanteraka. Ao amin'ny json, ny zavatra dia voatahiry araka ny tokony ho izy, ary ao amin'ny jsonb dia efa voatahiry amin'ny endriky ny rafitra voarakitra an-tsoratra. Izany no antony amin'ny tranga faharoa, ny sandan'ny zavatra amin'ny fanalahidy 1 dia nosoloina avy amin'ny [1, 2, 3] ho [7, 8, 9], izay niditra tao amin'ny rafitra amin'ny farany indrindra miaraka amin'ny fanalahidy mitovy.

Aza misotro rano amin'ny tavanao

SELECT '{"reading": 1.230e-5}'::jsonb
     , '{"reading": 1.230e-5}'::json

          jsonb         |         json
          jsonb         |         json
------------------------+----------------------
{"reading": 0.00001230} | {"reading": 1.230e-5}

Ny PostgreSQL amin'ny fampiharana JSONB dia manova ny fandrafetana ny isa tena izy, ka mitondra azy ireo amin'ny endrika klasika. Tsy mitranga amin'ny karazana JSON izany. Hafahafa kely fa marina ny azy.

File laharana efatra. daty/ora/ora

Misy ihany koa ny hafahafa amin'ny karazana daty/ora. Andeha hojerentsika izy ireo. MamelΓ  ahy hanao famandrihan-toerana avy hatrany fa hazava ny endri-pitondratena sasany raha azonao tsara ny maha-zava-dehibe ny fiasana amin'ny faritry ny ora. Lohahevitra ho an'ny lahatsoratra misaraka ihany koa anefa ity.

Ny anao tsy azoko

SELECT '08-Jan-99'::date

ERROR:  date/time field value out of range: "08-Jan-99"
LINE 1: SELECT '08-Jan-99'::date
               ^
HINT:  Perhaps you need a different "datestyle" setting.
********** Ошибка **********
ERROR: date/time field value out of range: "08-Jan-99"
SQL-состояниС: 22008
Подсказка: Perhaps you need a different "datestyle" setting.
Π‘ΠΈΠΌΠ²ΠΎΠ»: 8

Toa inona no tsy takatry ny saina eto? Saingy mbola tsy takatry ny angon-drakitra ny zavatra apetrakay voalohany eto - ny taona sa ny andro? Ary nanapa-kevitra izy fa tamin'ny 99 Janoary 2008 no nanaitra ny sainy. Amin'ny ankapobeny, rehefa mamindra daty amin'ny endrika lahatsoratra dia mila mandinika tsara ny fomba nahafantaran'ny angon-drakitra azy ireo ianao (indrindra fa ny famakafakana ny mari-pamantarana datestyle miaraka amin'ny baiko SHOW datestyle), satria mety ho lafo be ny ambiguity amin'ity raharaha ity.

Avy taiza no nahazoanao izany?

SELECT '04:05 Europe/Moscow'::time

ERROR:  invalid input syntax for type time: "04:05 Europe/Moscow"
LINE 1: SELECT '04:05 Europe/Moscow'::time
               ^
********** Ошибка **********
ERROR: invalid input syntax for type time: "04:05 Europe/Moscow"
SQL-состояниС: 22007
Π‘ΠΈΠΌΠ²ΠΎΠ»: 8

Nahoana no tsy azon'ny angon-drakitra ny fotoana voafaritra mazava? Satria ny faritry ny ora dia tsy manana fanafohezana, fa anarana feno, izay tsy misy dikany afa-tsy amin'ny tontolon'ny daty iray, satria raisina an-tsaina ny tantaran'ny fiovan'ny vanim-potoana, ary tsy mandeha tsy misy daty. Ary ny teny ao amin'ny tsipika fotoana dia mametraka fanontaniana - inona no tena dikan'ny programmer? Noho izany dia mitombina ny zava-drehetra eto raha jerena.

Inona no tsy mety aminy?

Alao sary an-tsaina ny toe-javatra. Manana saha ianao eo amin'ny latabatrao misy karazana timestamptz. Te-hanondro azy ianao. Saingy azonao fa ny fananganana tondro eo amin'io sehatra io dia tsy voamarina foana noho ny fahaizany misafidy (saika ny sanda rehetra amin'ity karazana ity dia tsy manam-paharoa). Noho izany dia manapa-kevitra ny hampihena ny fifantenana ny fanondroana ianao amin'ny alΓ lan'ny fandefasana ny karazana ho daty iray. Ary mahazo surprise ianao:

CREATE INDEX "iIdent-DateLastUpdate"
  ON public."Ident" USING btree
  (("DTLastUpdate"::date));

ERROR:  functions in index expression must be marked IMMUTABLE
********** Ошибка **********
ERROR: functions in index expression must be marked IMMUTABLE
SQL-состояниС: 42P17

Inona no olana? Ny zava-misy dia ny fanipazana karazana timestamptz amin'ny karazana daty, ny sandan'ny mari-pamantarana rafitra TimeZone dia ampiasaina, izay mahatonga ny fiovaovan'ny karazana fiankinan-doha amin'ny mari-pamantarana manokana, i.e. miovaova. Ny fiasa toy izany dia tsy azo atao amin'ny index. Amin'ity tranga ity, tsy maintsy asehonao mazava tsara hoe amin'ny faritra inona no anaovana ny karazana fandefasana.

Rehefa izao dia tsy izao mihitsy

Efa zatra izao() mamerina ny daty/ora amin'izao fotoana izao isika, amin'ny fijerena ny faritry ny ora. Fa jereo ireto fanontaniana manaraka ireto:

START TRANSACTION;
SELECT now();

            now
  timestamp with time zone
-----------------------------
2019-11-26 13:13:04.271419+03

...

SELECT now();

            now
  timestamp with time zone
-----------------------------
2019-11-26 13:13:04.271419+03

...

SELECT now();

            now
  timestamp with time zone
-----------------------------
2019-11-26 13:13:04.271419+03

COMMIT;

Ny daty/ora dia averina mitovy na firy na firy ny fotoana lasa hatramin'ny fangatahana teo aloha! Inona no olana? Ny zava-misy dia izao () dia tsy ny fotoana amin'izao fotoana izao, fa ny fotoana fanombohan'ny fifanakalozana ankehitriny. Noho izany dia tsy miova izany ao anatin'ny fifampiraharahana. Ny fanontaniana rehetra avoaka ivelan'ny sehatry ny fifampiraharahana dia voafono amin'ny fifampiraharahana an-kolaka, ka izany no tsy mahatsikaritra fa ny fotoana naverin'ny SELECT tsotra izao (); raha ny marina, tsy ny amin'izao fotoana izao ... Raha te-hahazo ora marina marina ianao dia mila mampiasa ny clock_timestamp() function.

File laharana fahadimy. kely

Hafahafa kely

SELECT '111'::bit(4)

 bit
bit(4)
------
1110

Lafiny inona no tokony ampiana ny bits raha misy fanitarana karazana? Toa eo ankavia. Ny fototra ihany anefa no manana hevitra hafa momba izany. Mitandrema: raha tsy mifanandrify ny isan'ny isa rehefa manipy karazana iray, dia tsy ho azonao izay tadiavinao. Izany dia mihatra amin'ny fampidirana bits amin'ny havanana sy trimming bits. Eo ankavanana koa...

File laharana enina. ARRAYS

Na dia NULL aza tsy nirehitra

SELECT ARRAY[1, 2] || NULL

?column?
integer[]
---------
{1,2}

Satria ny olona ara-dalΓ na no natsangana tamin'ny SQL, manantena izahay fa NULL ny vokatr'io fomba fiteny io. Tsy teo anefa ilay izy. Averina ny array. Nahoana? Satria amin'ity tranga ity ny base dia mametraka NULL amin'ny array integer ary miantso an-kolaka ny asa array_cat. Saingy mbola tsy fantatra mazava ny antony tsy namerenan'ity "cat array" ity ny array. Mila tsaroana ihany koa io fihetsika io.

Fintino. Betsaka ny zavatra hafahafa. Ny ankamaroan'izy ireo, mazava ho azy, dia tsy dia manakiana loatra ka miresaka momba ny fitondran-tena tsy mendrika. Ary ny hafa dia hazavaina amin'ny fanamorana ny fampiasana na ny fahamaroan'ny fampiharana azy amin'ny toe-javatra sasany. Saingy miaraka amin'izay koa, misy ny tsy ampoizina maro. Noho izany, mila mahafantatra momba azy ireo ianao. Raha mahita zavatra hafa hafahafa na tsy mahazatra ianao amin'ny fitondran-tena na inona na inona, dia manorata ao amin'ny fanehoan-kevitra, dia faly aho manampy ny dosie misy ao aminy.

Source: www.habr.com

Add a comment