ื˜ื™ืคื•ืกื™ื ื—ืฉื•ื“ื™ื

ืื™ืŸ ืฉื•ื ื“ื‘ืจ ื—ืฉื•ื“ ื‘ืžืจืื” ืฉืœื”ื. ื™ืชืจื” ืžื›ืš, ื”ื ืืคื™ืœื• ื ืจืื™ื ืœืš ืžื•ื›ืจื™ื ื”ื™ื˜ื‘ ื•ืœืื•ืจืš ื–ืžืŸ. ืื‘ืœ ื–ื” ืจืง ืขื“ ืฉืชื‘ื“ื•ืง ืื•ืชื. ื–ื” ื”ืžืงื•ื ืฉื‘ื• ื”ื ืžืจืื™ื ืืช ื˜ื‘ืขื ื”ืขืจืžื•ืžื™, ืขื•ื‘ื“ื™ื ืื—ืจืช ืœื’ืžืจื™ ืžืžื” ืฉืฆื™ืคื™ืชื. ื•ืœืคืขืžื™ื ื”ื ืขื•ืฉื™ื ืžืฉื”ื• ืฉื’ื•ืจื ืœืฉื™ืขืจ ืฉืœืš ืœื”ื–ื“ืงืฃ - ืœืžืฉืœ, ื”ื ืžืื‘ื“ื™ื ื ืชื•ื ื™ื ืกื•ื“ื™ื™ื ืฉื”ื•ืคืงื“ื• ืขืœื™ื”ื. ื›ืฉืžืชืขืžืชื™ื ืื™ืชื ื”ื ื˜ื•ืขื ื™ื ืฉื”ื ืœื ืžื›ื™ืจื™ื ืื—ื“ ืืช ื”ืฉื ื™, ืœืžืจื•ืช ืฉื‘ืฆืœืœื™ื ื”ื ืขื•ื‘ื“ื™ื ืงืฉื” ืชื—ืช ืื•ืชื• ืžื›ืกื” ืžื ื•ืข. ื”ื’ื™ืข ื”ื–ืžืŸ ืœื”ื‘ื™ื ืื•ืชื ืกื•ืฃ ืกื•ืฃ ืœืžื™ื ื ืงื™ื™ื. ื”ื‘ื” ื ืขืกื•ืง ื’ื ื‘ื˜ื™ืคื•ืกื™ื ื”ื—ืฉื•ื“ื™ื ื”ืœืœื•.

ื”ืงืœื“ืช ื ืชื•ื ื™ื ื‘-PostgreSQL, ืขืœ ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ืฉืœื”, ืื›ืŸ ืžืฆื™ื’ื” ืœืคืขืžื™ื ื”ืคืชืขื•ืช ืžื•ื–ืจื•ืช ืžืื•ื“. ื‘ืžืืžืจ ื–ื” ื ื ืกื” ืœื”ื‘ื”ื™ืจ ื›ืžื” ืžื”ืžื•ื–ืจื•ื™ื•ืช ืฉืœื”ื, ืœื”ื‘ื™ืŸ ืืช ื”ืกื™ื‘ื” ืœื”ืชื ื”ื’ื•ืชื ื”ืžื•ื–ืจื” ื•ืœื”ื‘ื™ืŸ ื›ื™ืฆื“ ืœื ืœื”ื™ืชืงืœ ื‘ื‘ืขื™ื•ืช ื‘ืชืจื’ื•ืœ ื”ื™ื•ืžื™ื•ืžื™. ืื ืœื•ืžืจ ืืช ื”ืืžืช, ืจื™ื›ื–ืชื™ ืืช ื”ืžืืžืจ ื”ื–ื” ื’ื ื›ืžืขื™ืŸ ืกืคืจ ืขื™ื•ืŸ ืœืขืฆืžื™, ืกืคืจ ืขื™ื•ืŸ ืฉื ื™ืชืŸ ืœื”ืชื™ื™ื—ืก ืืœื™ื• ื‘ืงืœื•ืช ื‘ืžืงืจื™ื ืฉื ื•ื™ื™ื ื‘ืžื—ืœื•ืงืช. ืœื›ืŸ, ื”ื•ื ื™ืชื—ื“ืฉ ื›ืืฉืจ ื™ืชื’ืœื• ื”ืคืชืขื•ืช ื—ื“ืฉื•ืช ืžื˜ื™ืคื•ืกื™ื ื—ืฉื•ื“ื™ื. ืื–, ื‘ื•ืื• ื ืœืš, ื”ื• ืขื•ืงื‘ื™ื ื‘ืœืชื™ ื ืœืื™ื ืฉืœ ืžืกื“ื™ ื ืชื•ื ื™ื!

ืชื™ืง ืžืกืคืจ ืื—ื“. ื“ื™ื•ืง ืืžื™ืชื™/ื›ืคื•ืœ/ืžืกืคืจื™/ื›ืกืฃ

ื ืจืื” ืฉืกื•ื’ื™ื ืžืกืคืจื™ื™ื ื”ื ื”ืคื—ื•ืช ื‘ืขื™ื™ืชื™ื™ื ืžื‘ื—ื™ื ืช ื”ืคืชืขื•ืช ื‘ื”ืชื ื”ื’ื•ืช. ืื‘ืœ ืœื ืžืฉื ื” ืื™ืš ื–ื”. ืื– ื‘ื•ืื• ื ืชื—ื™ืœ ืื™ืชื. ื›ืšโ€ฆ

ืฉื›ื—ืช ืื™ืš ืœืกืคื•ืจ

SELECT 0.1::real = 0.1

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

ืžื” ื”ื‘ืขื™ื”? ื”ื‘ืขื™ื” ื”ื™ื ืฉ-PostgreSQL ืžืžื™ืจ ืืช ื”ืงื‘ื•ืข ื”ืœื ืžื•ืงืœื“ 0.1 ืœื“ื™ื•ืง ื›ืคื•ืœ ื•ืžื ืกื” ืœื”ืฉื•ื•ืช ืื•ืชื• ืœ-0.1 ืžืกื•ื’ ืืžื™ืชื™. ื•ืืœื” ืžืฉืžืขื•ื™ื•ืช ืฉื•ื ื•ืช ืœื—ืœื•ื˜ื™ืŸ! ื”ืจืขื™ื•ืŸ ื”ื•ื ืœื™ื™ืฆื’ ืžืกืคืจื™ื ืžืžืฉื™ื™ื ื‘ื–ื™ื›ืจื•ืŸ ื”ืžื›ื•ื ื”. ืžื›ื™ื•ื•ืŸ ืฉืœื ื ื™ืชืŸ ืœื™ื™ืฆื’ 0.1 ื›ืฉื‘ืจ ื‘ื™ื ืืจื™ ืกื•ืคื™ (ื–ื” ื™ื”ื™ื” 0.0(0011) ื‘ื‘ื™ื ืืจื™), ืžืกืคืจื™ื ื‘ืขืœื™ ืกืคืจื•ืช ืฉื•ื ื•ืช ื™ื”ื™ื• ืฉื•ื ื™ื, ื•ืžื›ืืŸ ื”ืชื•ืฆืื” ืฉื”ื ืื™ื ื ืฉื•ื•ื™ื. ื‘ืื•ืคืŸ ื›ืœืœื™, ื–ื”ื• ื ื•ืฉื ืœืžืืžืจ ื ืคืจื“; ืœื ืื›ืชื•ื‘ ื›ืืŸ ื‘ื™ืชืจ ืคื™ืจื•ื˜.

ืžืื™ืคื” ื”ืฉื’ื™ืื”?

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

ืื ืฉื™ื ืจื‘ื™ื ื™ื•ื“ืขื™ื ืฉ-PostgreSQL ืžืืคืฉืจ ืกื™ืžื•ืŸ ืคื•ื ืงืฆื™ื•ื ืœื™ ืขื‘ื•ืจ ืœื™ื”ื•ืง ืกื•ื’. ื›ืœื•ืžืจ, ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืœื ืจืง 1::int, ืืœื ื’ื int(1), ืฉื™ื”ื™ื” ืฉื•ื•ื” ืขืจืš. ืื‘ืœ ืœื ืœื˜ื™ืคื•ืกื™ื ืฉืฉืžื•ืชื™ื”ื ืžื•ืจื›ื‘ื™ื ืžื›ืžื” ืžื™ืœื™ื! ืœื›ืŸ, ืื ื‘ืจืฆื•ื ืš ืœื”ื˜ื™ืœ ืขืจืš ืžืกืคืจื™ ืœื˜ื™ืคื•ืก ื“ื™ื•ืง ื›ืคื•ืœ ื‘ืฆื•ืจื” ืคื•ื ืงืฆื™ื•ื ืœื™ืช, ื”ืฉืชืžืฉ ื‘ื›ื™ื ื•ื™ ืฉืœ ืกื•ื’ ื–ื” float8, ื›ืœื•ืžืจ, SELECT float8(1).

ืžื” ื™ื•ืชืจ ื’ื“ื•ืœ ืžืื™ื ืกื•ืฃ?

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

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

ืชืจืื” ืื™ืš ื–ื”! ืžืกืชื‘ืจ ืฉื™ืฉ ืžืฉื”ื• ื’ื“ื•ืœ ืžืื™ื ืกื•ืฃ, ื•ื–ื” NaN! ื™ื—ื“ ืขื ื–ืืช, ื”ืชื™ืขื•ื“ ืฉืœ PostgreSQL ืžืกืชื›ืœ ืขืœื™ื ื• ื‘ืขื™ื ื™ื™ื ื›ื ื•ืช ื•ื˜ื•ืขืŸ ืฉ-NaN ื›ืžื•ื‘ืŸ ื’ื“ื•ืœ ืžื›ืœ ืžืกืคืจ ืื—ืจ, ื•ืœื›ืŸ, ืื™ื ืกื•ืฃ. ื”ื”ื™ืคืš ื ื›ื•ืŸ ื’ื ืœื’ื‘ื™ -NaN. ืฉืœื•ื, ืื•ื”ื‘ื™ ืžืชืžื˜ื™ืงื”! ืื‘ืœ ืขืœื™ื ื• ืœื–ื›ื•ืจ ืฉื›ืœ ื–ื” ืคื•ืขืœ ื‘ื”ืงืฉืจ ืฉืœ ืžืกืคืจื™ื ืžืžืฉื™ื™ื.

ืขื™ื’ื•ืœ ืขื™ื ื™ื™ื

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

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

ืขื•ื“ ื‘ืจื›ื” ืœื ืฆืคื•ื™ื” ืžื”ื‘ืกื™ืก. ืฉื•ื‘, ื–ื›ืจื• ืฉืœื“ื™ื•ืง ื›ืคื•ืœ ื•ืœืกื•ื’ื™ื ืžืกืคืจื™ื™ื ื™ืฉ ืืคืงื˜ื™ื ืฉื•ื ื™ื ืฉืœ ืขื™ื’ื•ืœ. ืขื‘ื•ืจ ืžืกืคืจื™ - ื”ืจื’ื™ืœ, ื›ืืฉืจ 0,5 ืžืขื•ื’ืœ ื›ืœืคื™ ืžืขืœื”, ื•ืœื“ื™ื•ืง ื›ืคื•ืœ - 0,5 ืžืขื•ื’ืœ ืœืžืกืคืจ ื”ืฉืœื ื”ื–ื•ื’ื™ ื”ืงืจื•ื‘ ื‘ื™ื•ืชืจ.

ื›ืกืฃ ื–ื” ืžืฉื”ื• ืžื™ื•ื—ื“

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

ืœืคื™ PostgreSQL, ื›ืกืฃ ื”ื•ื ืœื ืžืกืคืจ ืืžื™ืชื™. ื’ื ืœืคื™ ื›ืžื” ืื ืฉื™ื. ืขืœื™ื ื• ืœื–ื›ื•ืจ ื›ื™ ื”ืœื™ื”ื•ืง ืฉืœ ืกื•ื’ ื”ื›ืกืฃ ืืคืฉืจื™ ืจืง ืœืกื•ื’ ื”ืžืกืคืจื™, ื‘ื“ื™ื•ืง ื›ืคื™ ืฉื ื™ืชืŸ ืœื”ื˜ื™ืœ ืจืง ืืช ื”ืกื•ื’ ื”ืžืกืคืจื™ ืœืกื•ื’ ื”ื›ืกืฃ. ืื‘ืœ ืขื›ืฉื™ื• ืืชื” ื™ื›ื•ืœ ืœืฉื—ืง ืขื ื–ื” ื›ืื•ื•ืช ื ืคืฉืš. ืื‘ืœ ื–ื” ืœื ื™ื”ื™ื” ืื•ืชื• ื›ืกืฃ.

Smallint ื•ื™ืฆื™ืจืช ืจืฆืฃ

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 ืœื ืื•ื”ื‘ ืœื‘ื–ื‘ื– ื–ืžืŸ ืขืœ ื–ื•ื˜ื•ืช. ืžื” ื”ื ื”ืจืฆืคื™ื ื”ืืœื” ื”ืžื‘ื•ืกืกื™ื ืขืœ ืกืžื•ืœื™ื ื˜? int, ืœื ืคื—ื•ืช! ืœื›ืŸ, ื›ืืฉืจ ืžื ืกื™ื ืœื‘ืฆืข ืืช ื”ืฉืื™ืœืชื” ื”ื "ืœ, ืžืกื“ ื”ื ืชื•ื ื™ื ืžื ืกื” ืœื”ื˜ื™ืœ ืื™ื ื˜ ืงื˜ืŸ ืœืกื•ื’ ืžืกืคืจ ืฉืœื ืื—ืจ, ื•ืจื•ืื” ืฉื™ื™ืชื›ืŸ ืฉื™ื”ื™ื• ื›ืžื” ื”ืฉืœืžื•ืช ื›ืืœื”. ืื™ื–ื” ืงืืกื˜ ืœื‘ื—ื•ืจ? ื”ื™ื ืœื ื™ื›ื•ืœื” ืœื”ื—ืœื™ื˜ ืขืœ ื›ืš, ื•ืœื›ืŸ ืงื•ืจืกืช ืขื ืฉื’ื™ืื”.

ืชื™ืง ืžืกืคืจ ืฉืชื™ื™ื. "char"/char/varchar/text

ืžืกืคืจ ืžื•ื–ืจื•ื™ื•ืช ืงื™ื™ืžื•ืช ื’ื ื‘ืกื•ื’ื™ ืชื•ื•ื™ื. ื‘ื•ืื• ืœื”ื›ื™ืจ ื’ื ืื•ืชื.

ืื™ื–ื” ืกื•ื’ ืฉืœ ื˜ืจื™ืงื™ื ืืœื”?

SELECT 'ะŸะ•ะขะฏ'::"char"
     , 'ะŸะ•ะขะฏ'::"char"::bytea
     , 'ะŸะ•ะขะฏ'::char
     , 'ะŸะ•ะขะฏ'::char::bytea

 char  | bytea |    bpchar    | bytea
"char" | bytea | character(1) | bytea
-------+-------+--------------+--------
 โ•จ     | xd0  | ะŸ            | xd09f

ืื™ื–ื” ืกื•ื’ ืฉืœ "ืฆ'ืืจ" ื–ื”, ืื™ื–ื” ืกื•ื’ ืฉืœ ืœื™ืฆืŸ ื–ื”? ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืืช ืืœื”... ื›ื™ ื–ื” ืžืชื™ื™ืžืจ ืœื”ื™ื•ืช char ืจื’ื™ืœ, ืœืžืจื•ืช ืฉื–ื” ื‘ืžืจื›ืื•ืช. ื•ื”ื•ื ื ื‘ื“ืœ ืž-char ืจื’ื™ืœ, ืฉื”ื•ื ืœืœื ืžืจื›ืื•ืช, ื‘ื›ืš ืฉื”ื•ื ืžื•ืฆื™ื ืจืง ืืช ื”ื‘ื™ื˜ ื”ืจืืฉื•ืŸ ืฉืœ ื™ื™ืฆื•ื’ ื”ืžื—ืจื•ื–ืช, ื‘ืขื•ื“ ืฉ-char ืจื’ื™ืœ ืžื•ืฆื™ื ืืช ื”ืชื• ื”ืจืืฉื•ืŸ. ื‘ืžืงืจื” ืฉืœื ื•, ื”ืชื• ื”ืจืืฉื•ืŸ ื”ื•ื ื”ืื•ืช P, ืืฉืจ ื‘ื™ื™ืฆื•ื’ unicode ืชื•ืคืกืช 2 ื‘ืชื™ื, ื›ืคื™ ืฉืžืขื™ื“ื™ื ืขืœ ื™ื“ื™ ื”ืžืจืช ื”ืชื•ืฆืื” ืœืกื•ื’ bytea. ื•ื”ืกื•ื’ "char" ืœื•ืงื— ืจืง ืืช ื”ื‘ื™ื˜ ื”ืจืืฉื•ืŸ ืฉืœ ื™ื™ืฆื•ื’ ื™ื•ื ื™ืงื•ื“ ื–ื”. ืื– ืœืžื” ืฆืจื™ืš ืืช ื”ืกื•ื’ ื”ื–ื”? ื”ืชื™ืขื•ื“ ืฉืœ PostgreSQL ืื•ืžืจ ืฉื–ื”ื• ืกื•ื’ ืžื™ื•ื—ื“ ื”ืžืฉืžืฉ ืœืฆืจื›ื™ื ืžื™ื•ื—ื“ื™ื. ืื– ืœื ืกื‘ื™ืจ ืฉื ื–ื“ืงืง ืœื–ื”. ืื‘ืœ ืชืกืชื›ืœ ื‘ืขื™ื ื™ื• ื•ืœื ืชื˜ืขื” ื›ืฉืชืคื’ื•ืฉ ืื•ืชื• ื‘ื”ืชื ื”ื’ื•ืชื• ื”ืžื™ื•ื—ื“ืช.

ื—ืœืœื™ื ื ื•ืกืคื™ื. ืจื—ื•ืง ืžื”ืขื™ืŸ ืจื—ื•ืง ืžื”ืœื‘

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

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

ืชืกืชื›ืœ ืขืœ ื”ื“ื•ื’ืžื” ืฉื ื™ืชื ื”. ื”ืžืจืชื™ ื‘ืžื™ื•ื—ื“ ืืช ื›ืœ ื”ืชื•ืฆืื•ืช ืœืกื•ื’ bytea, ื›ืš ืฉื™ื”ื™ื” ื‘ืจื•ืจ ืžื” ื™ืฉ ืฉื. ืื™ืคื” ื”ืจื•ื•ื—ื™ื ื”ื ื’ืจืจื™ื ืœืื—ืจ ื”ืœื™ื”ื•ืง ืœ-varchar(6)? ื”ืชื™ืขื•ื“ ืงื•ื‘ืข ื‘ืชืžืฆื™ืชื™ื•ืช: "ื‘ืขืช ื™ืฆื™ืงืช ืขืจืš ื”ื“ืžื•ืช ืœืกื•ื’ ื“ืžื•ืช ืื—ืจ, ื”ืจื•ื•ื— ื”ืœื‘ืŸ ื”ื ื’ืจืจ ื ืžื—ืง." ื™ืฉ ืœื–ื›ื•ืจ ืืช ื”ืกืœื™ื“ื” ื”ื–ื•. ื•ืฉื™ืžื• ืœื‘ ืฉืื ืงื‘ื•ืข ืžื—ืจื•ื–ืช ืžืฆื•ื˜ื˜ ื™ืฆื•ืง ื™ืฉื™ืจื•ืช ืœืกื•ื’ varchar(6), ื”ืจื•ื•ื—ื™ื ื”ื ื’ืจืจื™ื ื ืฉืžืจื™ื. ื›ืืœื” ื”ื ื”ื ื™ืกื™ื.

ืชื™ืง ืžืกืคืจ ืฉืœื•ืฉ. json/jsonb

JSON ื”ื•ื ืžื‘ื ื” ื ืคืจื“ ืฉื—ื™ ืืช ื—ื™ื™ื• ืฉืœื•. ืœื›ืŸ, ื”ื™ืฉื•ื™ื•ืช ืฉืœื” ื•ืฉืœ PostgreSQL ืฉื•ื ื•ืช ื‘ืžืงืฆืช. ื”ื ื” ื“ื•ื’ืžืื•ืช.

ื’'ื•ื ืกื•ืŸ ื•ื’'ื•ื ืกื•ืŸ. ืœื”ืจื’ื™ืฉ ืืช ื”ื”ื‘ื“ืœ

SELECT 'null'::jsonb IS NULL

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

ื”ืขื ื™ื™ืŸ ื”ื•ื ืฉืœ-JSON ื™ืฉ ื™ืฉื•ืช null ืžืฉืœื”, ืฉื”ื™ื ืœื ื”ืื ืœื•ื’ื™ ืฉืœ NULL ื‘-PostgreSQL. ื™ื—ื“ ืขื ื–ืืช, ื™ื™ืชื›ืŸ ืฉืœืื•ื‘ื™ื™ืงื˜ JSON ืขืฆืžื• ื™ื”ื™ื” ื”ืขืจืš NULL, ื•ืœื›ืŸ ื”ื‘ื™ื˜ื•ื™ SELECT null::jsonb IS NULL (ืฉื™ื ืœื‘ ืœื”ื™ืขื“ืจ ืžืจื›ืื•ืช ื‘ื•ื“ื“ื•ืช) ื™ื—ื–ื•ืจ ื”ืคืขื true.

ืื•ืช ืื—ืช ืžืฉื ื” ื”ื›ืœ

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]}

ื”ืขื ื™ื™ืŸ ื”ื•ื ืฉ-json ื•-jsonb ื”ื ืžื‘ื ื™ื ืฉื•ื ื™ื ืœื—ืœื•ื˜ื™ืŸ. ื‘-json, ื”ืื•ื‘ื™ื™ืงื˜ ืžืื•ื—ืกืŸ ื›ืคื™ ืฉื”ื•ื, ื•ื‘-jsonb ื”ื•ื ื›ื‘ืจ ืžืื•ื—ืกืŸ ื‘ืฆื•ืจื” ืฉืœ ืžื‘ื ื” ืžื ื•ืชื— ื•ืื™ื ื“ืงืก. ืœื›ืŸ ื‘ืžืงืจื” ื”ืฉื ื™ ื”ื•ื—ืœืฃ ืขืจืš ื”ืื•ื‘ื™ื™ืงื˜ ื‘ืžืคืชื— 1 ืž- [1, 2, 3] ืœ- [7, 8, 9], ืฉื ื›ื ืก ืœืžื‘ื ื” ืžืžืฉ ื‘ืกื•ืคื• ืขื ืื•ืชื• ืžืคืชื—.

ืืœ ืชืฉืชื” ืžื™ื ืžื”ืคื ื™ื ืฉืœืš

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

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

PostgreSQL ื‘ื™ื™ืฉื•ื JSONB ืฉืœื” ืžืฉื ื” ืืช ื”ืขื™ืฆื•ื‘ ืฉืœ ืžืกืคืจื™ื ืืžื™ืชื™ื™ื, ื•ืžื‘ื™ื ืื•ืชื ืœืฆื•ืจื” ื”ืงืœืืกื™ืช. ื–ื” ืœื ืงื•ืจื” ืขื‘ื•ืจ ืกื•ื’ JSON. ืงืฆืช ืžื•ื–ืจ, ืื‘ืœ ื”ื•ื ืฆื•ื“ืง.

ืชื™ืง ืžืกืคืจ ืืจื‘ืข. ืชืืจื™ืš/ืฉืขื”/ื—ื•ืชืžืช ื–ืžืŸ

ื™ืฉ ื’ื ื›ืžื” ืžื•ื–ืจื•ื™ื•ืช ืขื ืกื•ื’ื™ ืชืืจื™ืš/ืฉืขื”. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœื™ื”ื. ื”ืจืฉื• ืœื™ ืœื”ืกืชื™ื™ื’ ืžื™ื“ ืฉื—ืœืง ืžื”ืžืืคื™ื™ื ื™ื ื”ื”ืชื ื”ื’ื•ืชื™ื™ื ืžืชื‘ืจืจื™ื ืื ืืชื ืžื‘ื™ื ื™ื ื”ื™ื˜ื‘ ืืช ืžื”ื•ืช ื”ืขื‘ื•ื“ื” ืขื ืื–ื•ืจื™ ื–ืžืŸ. ืื‘ืœ ื–ื” ื’ื ื ื•ืฉื ืœืžืืžืจ ื ืคืจื“.

ืื ื™ ืœื ืžื‘ื™ืŸ ืืช ืฉืœืš

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

ื ืจืื” ืฉืžื” ืœื ืžื•ื‘ืŸ ื›ืืŸ? ืื‘ืœ ื”ืžืื’ืจ ืขื“ื™ื™ืŸ ืœื ืžื‘ื™ืŸ ืžื” ืฉืžื ื• ื›ืืŸ ื‘ืžืงื•ื ื”ืจืืฉื•ืŸ - ื”ืฉื ื” ืื• ื”ื™ื•ื? ื•ื”ื™ื ืžื—ืœื™ื˜ื” ืฉื–ื” 99 ื‘ื™ื ื•ืืจ 2008, ืžื” ืฉืžื˜ืจื™ืฃ ืืช ื“ืขืชื”. ื‘ืื•ืคืŸ ื›ืœืœื™, ื‘ืขืช ืฉื™ื“ื•ืจ ืชืืจื™ื›ื™ื ื‘ืคื•ืจืžื˜ ื˜ืงืกื˜, ืืชื” ืฆืจื™ืš ืœื‘ื“ื•ืง ื‘ื–ื”ื™ืจื•ืช ืจื‘ื” ืขื“ ื›ืžื” ืžืกื“ ื”ื ืชื•ื ื™ื ื–ื™ื”ื” ืื•ืชื ื‘ืฆื•ืจื” ื ื›ื•ื ื” (ื‘ืคืจื˜, ืœื ืชื— ืืช ื”ืคืจืžื˜ืจ datestyle ืขื ื”ืคืงื•ื“ื” SHOW datestyle), ืฉื›ืŸ ืื™ ื‘ื”ื™ืจื•ืช ื‘ืขื ื™ื™ืŸ ื–ื” ืขืฉื•ื™ื•ืช ืœื”ื™ื•ืช ื™ืงืจื•ืช ืžืื•ื“.

ืžืื™ืคื” ื‘ืืช?

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

ืžื“ื•ืข ืžืกื“ ื”ื ืชื•ื ื™ื ืœื ื™ื›ื•ืœ ืœื”ื‘ื™ืŸ ืืช ื”ื–ืžืŸ ืฉืฆื•ื™ืŸ ื‘ืžืคื•ืจืฉ? ื›ื™ ืœืื–ื•ืจ ื”ื–ืžืŸ ืื™ืŸ ืงื™ืฆื•ืจ, ืืœื ืฉื ืžืœื, ื•ื–ื” ื”ื’ื™ื•ื ื™ ืจืง ื‘ื”ืงืฉืจ ืฉืœ ืชืืจื™ืš, ืฉื›ืŸ ื”ื•ื ืœื•ืงื— ื‘ื—ืฉื‘ื•ืŸ ืืช ื”ื™ืกื˜ื•ืจื™ื™ืช ื”ืฉื™ื ื•ื™ื™ื ื‘ืื–ื•ืจ ื”ื–ืžืŸ, ื•ื”ื•ื ืœื ืขื•ื‘ื“ ื‘ืœื™ ืชืืจื™ืš. ื•ืขืฆื ื”ื ื™ืกื•ื— ืฉืœ ืฆื™ืจ ื”ื–ืžืŸ ืžืขืœื” ืฉืืœื•ืช โ€“ ืœืžื” ื‘ืืžืช ื”ืชื›ื•ื•ืŸ ื”ืžืชื›ื ืช? ืœื›ืŸ, ื”ื›ืœ ื”ื’ื™ื•ื ื™ ื›ืืŸ, ืื ืžืกืชื›ืœื™ื ืขืœ ื–ื”.

ืžื” ืœื ื‘ืกื“ืจ ืื™ืชื•?

ื“ืžื™ื™ื ื• ืืช ื”ืžืฆื‘. ื™ืฉ ืœืš ืฉื“ื” ื‘ื˜ื‘ืœื” ืฉืœืš ืขื ื”ืกื•ื’ timestamptz. ืืชื” ืจื•ืฆื” ืœื”ื•ืกื™ืฃ ืื•ืชื• ืœืื™ื ื“ืงืก. ืื‘ืœ ืืชื” ืžื‘ื™ืŸ ืฉื‘ื ื™ื™ืช ืื™ื ื“ืงืก ื‘ืชื—ื•ื ื–ื” ืœื ืชืžื™ื“ ืžื•ืฆื“ืงืช ื‘ื’ืœืœ ื”ืกืœืงื˜ื™ื‘ื™ื•ืช ื”ื’ื‘ื•ื”ื” ืฉืœื• (ื›ืžืขื˜ ื›ืœ ื”ืขืจื›ื™ื ืžืกื•ื’ ื–ื” ื™ื”ื™ื• ื™ื™ื—ื•ื“ื™ื™ื). ืื– ืืชื” ืžื—ืœื™ื˜ ืœื”ืคื—ื™ืช ืืช ื”ืกืœืงื˜ื™ื‘ื™ื•ืช ืฉืœ ื”ืžื“ื“ ืขืœ ื™ื“ื™ ื™ืฆื™ืงืช ื”ื˜ื™ืคื•ืก ืœืชืืจื™ืš. ื•ืชืงื‘ืœื• ื”ืคืชืขื”:

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

ืžื” ื”ื‘ืขื™ื”? ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉื›ื“ื™ ืœื”ื˜ื™ืœ ืกื•ื’ ื—ื•ืชืžืช ื–ืžืŸ ืœืกื•ื’ ืชืืจื™ืš, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืขืจืš ืฉืœ ืคืจืžื˜ืจ ืžืขืจื›ืช TimeZone, ืžื” ืฉื”ื•ืคืš ืืช ืคื•ื ืงืฆื™ื™ืช ื”ืžืจืช ื”ืกื•ื’ ืœืชืœื•ื™ื” ื‘ืคืจืžื˜ืจ ืžื•ืชืื ืื™ืฉื™ืช, ื›ืœื•ืžืจ. ื ึธื“ึดื™ืฃ. ืคื•ื ืงืฆื™ื•ืช ื›ืืœื” ืื™ื ืŸ ืžื•ืชืจื•ืช ื‘ืื™ื ื“ืงืก. ื‘ืžืงืจื” ื–ื”, ืขืœื™ืš ืœืฆื™ื™ืŸ ื‘ืžืคื•ืจืฉ ื‘ืื™ื–ื” ืื–ื•ืจ ื–ืžืŸ ืžื‘ืฆืขื™ื ืืช ื”ื”ื˜ืœื”.

ื›ืฉืขื›ืฉื™ื• ื–ื” ื‘ื›ืœืœ ืœื ืขื›ืฉื™ื•

ืื ื—ื ื• ืจื’ื™ืœื™ื ืœ- now() ืœื”ื—ื–ื™ืจ ืืช ื”ืชืืจื™ืš/ืฉืขื” ื”ื ื•ื›ื—ื™ื™ื, ืชื•ืš ื”ืชื—ืฉื‘ื•ืช ื‘ืื™ื–ื•ืจ ื”ื–ืžืŸ. ืื‘ืœ ืชืกืชื›ืœ ืขืœ ื”ืฉืื™ืœืชื•ืช ื”ื‘ืื•ืช:

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;

ื”ืชืืจื™ืš/ืฉืขื” ืžื•ื—ื–ืจื™ื ื–ื”ื™ื ืœื ืžืฉื ื” ื›ืžื” ื–ืžืŸ ืขื‘ืจ ืžืื– ื”ื‘ืงืฉื” ื”ืงื•ื“ืžืช! ืžื” ื”ื‘ืขื™ื”? ื”ืขื•ื‘ื“ื” ื”ื™ื ืฉืขื›ืฉื™ื•() ืื™ื ื• ื”ื–ืžืŸ ื”ื ื•ื›ื—ื™, ืืœื ืฉืขืช ื”ื”ืชื—ืœื” ืฉืœ ื”ืขืกืงื” ื”ื ื•ื›ื—ื™ืช. ืœื›ืŸ, ื–ื” ืœื ืžืฉืชื ื” ื‘ืชื•ืš ื”ืขืกืงื”. ื›ืœ ืฉืื™ืœืชื” ื”ืžื•ืคืขืœืช ืžื—ื•ืฅ ืœื”ื™ืงืฃ ืฉืœ ืขืกืงื” ืขื˜ื•ืคื” ื‘ื˜ืจื ื–ืงืฆื™ื” ื‘ืื•ืคืŸ ืžืจื•ืžื–, ื•ื–ื• ื”ืกื™ื‘ื” ืฉืื ื—ื ื• ืœื ืฉืžื™ื ืœื‘ ืฉื”ื–ืžืŸ ืžื•ื—ื–ืจ ืขืœ ื™ื“ื™ SELECT ืคืฉื•ื˜ now(); ืœืžืขืฉื”, ืœื ื”ื ื•ื›ื—ื™... ืื ืืชื” ืจื•ืฆื” ืœืงื‘ืœ ืฉืขื” ื ื•ื›ื—ื™ืช ื›ื ื”, ืืชื” ืฆืจื™ืš ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” clock_timestamp() .

ืชื™ืง ืžืกืคืจ ื—ืžืฉ. ืงืฆืช

ืงืฆืช ืžื•ื–ืจ

SELECT '111'::bit(4)

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

ืื™ื–ื” ืฆื“ ื™ืฉ ืœื”ื•ืกื™ืฃ ืืช ื”ื‘ื™ื˜ื™ื ื‘ืžืงืจื” ืฉืœ ื”ืจื—ื‘ืช ืกื•ื’? ื ืจืื” ืฉื”ื•ื ื‘ืฆื“ ืฉืžืืœ. ืื‘ืœ ืจืง ืœื‘ืกื™ืก ื™ืฉ ื“ืขื” ืื—ืจืช ื‘ืขื ื™ื™ืŸ ื–ื”. ื”ื™ื–ื”ืจ: ืื ืžืกืคืจ ื”ืกืคืจื•ืช ืื™ื ื• ืชื•ืื ื‘ืขืช ื™ืฆื™ืงืช ื˜ื™ืคื•ืก, ืœื ืชืงื‘ืœ ืืช ืžื” ืฉืจืฆื™ืช. ื–ื” ื—ืœ ื’ื ืขืœ ื”ื•ืกืคืช ื‘ื™ื˜ื™ื ืœื™ืžื™ืŸ ื•ื’ื ืขืœ ื—ื™ืชื•ืš ื‘ื™ื˜ื™ื. ื’ื ืžื™ืžื™ืŸ...

ืชื™ืง ืžืกืคืจ ืฉืฉ. ืžืขืจื›ื™ื

ืืคื™ืœื• NULL ืœื ื™ืจื”

SELECT ARRAY[1, 2] || NULL

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

ื›ืื ืฉื™ื ืจื’ื™ืœื™ื ืฉื’ื“ืœื• ืขืœ SQL, ืื ื• ืžืฆืคื™ื ืฉื”ืชื•ืฆืื” ืฉืœ ื”ื‘ื™ื˜ื•ื™ ื”ื–ื” ืชื”ื™ื” NULL. ืื‘ืœ ื–ื” ืœื ื”ื™ื” ืฉื. ืžืขืจืš ืžื•ื—ื–ืจ. ืœืžื”? ืžื›ื™ื•ื•ืŸ ืฉื‘ืžืงืจื” ื–ื” ื”ื‘ืกื™ืก ืžื˜ื™ืœ NULL ืœืžืขืจืš ืฉืœื ื•ืงื•ืจื ื‘ืื•ืคืŸ ืžืจื•ืžื– ืœืคื•ื ืงืฆื™ื” array_cat. ืื‘ืœ ืขื“ื™ื™ืŸ ืœื ื‘ืจื•ืจ ืžื“ื•ืข "ื—ืชื•ืœ ื”ืžืขืจืš" ื”ื–ื” ืœื ืžืืคืก ืืช ื”ืžืขืจืš. ื’ื ืืช ื”ื”ืชื ื”ื’ื•ืช ื”ื–ื• ืฆืจื™ืš ืจืง ืœื–ื›ื•ืจ.

ืœึฐืกึทื›ึผึตื. ื™ืฉ ื”ืจื‘ื” ื“ื‘ืจื™ื ืžื•ื–ืจื™ื. ืจื•ื‘ื, ื›ืžื•ื‘ืŸ, ืœื ื›ืœ ื›ืš ื‘ื™ืงื•ืจืชื™ื™ื ืขื“ ืฉื”ื ืžื“ื‘ืจื™ื ืขืœ ื”ืชื ื”ื’ื•ืช ื‘ืœืชื™ ื”ื•ืœืžืช ื‘ืขืœื™ืœ. ื•ืื—ืจื™ื ืžื•ืกื‘ืจื™ื ืขืœ ื™ื“ื™ ืงืœื•ืช ื”ืฉื™ืžื•ืฉ ืื• ืชื“ื™ืจื•ืช ื”ื™ื™ืฉื•ื ืฉืœื”ื ื‘ืžืฆื‘ื™ื ืžืกื•ื™ืžื™ื. ืื‘ืœ ื™ื—ื“ ืขื ื–ืืช, ื™ืฉ ื”ืจื‘ื” ื”ืคืชืขื•ืช. ืœื›ืŸ, ืืชื” ืฆืจื™ืš ืœื“ืขืช ืขืœื™ื”ื. ืื ืชืžืฆืื• ืขื•ื“ ืžืฉื”ื• ืžื•ื–ืจ ืื• ื—ืจื™ื’ ื‘ื”ืชื ื”ื’ื•ืช ืžื›ืœ ืกื•ื’ ืฉื”ื•ื, ื›ืชื‘ื• ื‘ืชื’ื•ื‘ื•ืช, ืืฉืžื— ืœื”ื•ืกื™ืฃ ืœืชื™ืงื™ื ื”ื–ืžื™ื ื™ื ืขืœื™ื”ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”