Π ΠΈΡ Π²Π½Π΅ΡΠ½Π΅ΠΌ ΠΎΠ±Π»ΠΈΠΊΠ΅ Π½ΠΈΡΡΠΎ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΠΎΠ·ΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠ°ΠΆΡΡΡΡ ΡΠ΅Π±Π΅ Ρ ΠΎΡΠΎΡΠΎ ΠΈ Π΄Π°Π²Π½ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡΠΌΠΈ. ΠΠΎ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΡ ΠΈΡ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ. ΠΠΎΡ ΡΡΡ-ΡΠΎ ΠΎΠ½ΠΈ ΠΈ ΠΏΡΠΎΡΠ²ΡΡ ΡΠ²ΠΎΡ ΠΊΠΎΠ²Π°ΡΠ½ΡΡ ΡΡΡΠ½ΠΎΡΡΡ, ΡΡΠ°Π±ΠΎΡΠ°Π² ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡ ΠΎΠΆΠΈΠ΄Π°Π». Π ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΠΊΠΈΠ΄ΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΎΠ΅, ΠΎΡ ΡΠ΅Π³ΠΎ Π²ΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΡΠ°ΡΡ Π΄ΡΠ±ΠΎΠΌ β ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΡΠ΅ΡΡΡΡ Π΄ΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠ΅ ΠΈΠΌ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠΎΠ³Π΄Π° ΡΡ Π΄Π΅Π»Π°Π΅ΡΡ ΠΈΠΌ ΠΎΡΠ½ΡΡ ΡΡΠ°Π²ΠΊΡ, ΠΎΠ½ΠΈ ΡΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ, ΡΡΠΎ Π½Π΅ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°, Ρ ΠΎΡΡ Π² ΡΠ΅Π½ΠΈ ΡΡΠ΅ΡΠ΄Π½ΠΎ ΡΡΡΠ΄ΡΡΡΡ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ»ΠΏΠ°ΠΊΠΎΠΌ. ΠΠΎΡΠ° ΡΠΆΠ΅ Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ Π²ΡΠ²Π΅ΡΡΠΈ ΠΈΡ Π½Π° ΡΠΈΡΡΡΡ Π²ΠΎΠ΄Ρ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΆΠ΅ ΠΈ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΡΡΠΈΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ.
Π’ΠΈΠΏΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ Π² PostgreSQL, ΠΏΡΠΈ Π²ΡΠ΅ΠΉ ΡΠ²ΠΎΠ΅ΠΉ Π»ΠΎΠ³ΠΈΡΠ½ΠΎΡΡΠΈ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ΅ΠΏΠΎΠ΄Π½ΠΎΡΠΈΡ ΠΏΠΎΡΠΎΠΉ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΡΠ΅ ΡΡΡΠΏΡΠΈΠ·Ρ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΏΠΎΡΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΏΡΠΎΡΡΠ½ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡ ΠΏΡΠΈΡΡΠ΄Ρ, ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΈΡ ΡΡΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ Π½Π΅ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅. Π‘ΠΊΠ°Π·Π°ΡΡ ΠΏΠΎ ΠΏΡΠ°Π²Π΄Π΅, Ρ ΡΠΎΡΡΠ°Π²ΠΈΠ» ΡΡΡ ΡΡΠ°ΡΡΡ Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π΅ΠΊΠΎΠ΅Π³ΠΎ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠ° Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ΅Π±Ρ, ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ Π² ΡΠΏΠΎΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ . ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΡΡΠΏΡΠΈΠ·ΠΎΠ² ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ². ΠΡΠ°ΠΊ, Π² ΠΏΡΡΡ, ΠΎ Π½Π΅ΡΡΠΎΠΌΠΈΠΌΡΠ΅ ΡΠ»Π΅Π΄ΠΎΠΏΡΡΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ !
ΠΠΎΡΡΠ΅ Π½ΠΎΠΌΠ΅Ρ ΠΎΠ΄ΠΈΠ½. real/double precision/numeric/money
ΠΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΡΡΠΏΡΠΈΠ·ΠΎΠ² Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ. ΠΠΎ ΠΊΠ°ΠΊ Π±Ρ Π½Π΅ ΡΠ°ΠΊ. ΠΠΎΡΡΠΎΠΌΡ Ρ Π½ΠΈΡ ΠΈ Π½Π°ΡΠ½Π΅ΠΌ. ΠΡΠ°ΠΊ…
Π Π°Π·ΡΡΠΈΠ»ΠΈΡΡ ΡΡΠΈΡΠ°ΡΡ
SELECT 0.1::real = 0.1
?column?
boolean
---------
f
Π ΡΠ΅ΠΌ Π΄Π΅Π»ΠΎ? Π ΡΠΎΠΌ, ΡΡΠΎ PostgreSQL ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π½Π΅ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ 0.1 ΠΊ ΡΠΈΠΏΡ double precision ΠΈ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΠ°Π²Π½ΠΈΡΡ Π΅Π΅ Ρ 0.1 ΡΠΈΠΏΠ° real. Π ΡΡΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠ°Π·Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ! Π‘ΡΡΡ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π²Π΅ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠΈΡΠ΅Π» Π² ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ 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), ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ. ΠΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ², Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ»ΠΎΠ²! ΠΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠΈΡΠ»ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠΈΠΏΡ double precision Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π°Π»ΠΈΠ°Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° 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
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠ²Π΅Ρ ΠΎΡ Π±Π°Π·Ρ. Π ΡΠ½ΠΎΠ²Π° Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Π΄Π»Ρ ΡΠΈΠΏΠΎΠ² double precision ΠΈ numeric Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΡ. ΠΠ»Ρ numeric β ΠΎΠ±ΡΡΠ½ΠΎΠ΅, ΠΊΠΎΠ³Π΄Π° 0,5 ΠΎΠΊΡΡΠ³Π»ΡΠ΅ΡΡΡ Π² Π±ΠΎΠ»ΡΡΡΡ ΡΡΠΎΡΠΎΠ½Ρ, Π° Π΄Π»Ρ double precision β ΠΎΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ 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, Π΄Π΅Π½ΡΠ³ΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ Π²Π΅ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ. ΠΠΎ ΠΌΠ½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΡΠΌΠΎΠ², ΡΠΎΠΆΠ΅. ΠΠ°ΠΌ ΠΆΠ΅ Π½Π°Π΄ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° money Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠΈΠΏΡ numeric, ΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ ΠΊ ΡΠΈΠΏΡ money ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΏ numeric. Π Π²ΠΎΡ Ρ Π½ΠΈΠΌ ΡΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³ΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ Π΄ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ³ΠΎΠ΄Π½ΠΎ. ΠΠΎ ΡΡΠΎ Π±ΡΠ΄ΡΡ ΡΠΆΠ΅ Π½Π΅ ΡΠ΅ Π΄Π΅Π½ΡΠ³ΠΈ.
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 ΠΌΠ΅Π»ΠΎΡΠΈΡΡΡΡ. ΠΠ°ΠΊΠΈΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ smallint? int, Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅! ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π±Π°Π·Π° ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ smallint ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠΌΡ ΡΠΈΠΏΡ, ΠΈ Π²ΠΈΠ΄ΠΈΡ, ΡΡΠΎ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ. ΠΠ°ΠΊΠΎΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡ? ΠΡΠΎ ΠΎΠ½Π° ΡΠ΅ΡΠΈΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
ΠΠΎΡΡΠ΅ Π½ΠΎΠΌΠ΅Ρ Π΄Π²Π°. Β«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, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅Π· ΠΊΠ°Π²ΡΡΠ΅ΠΊ, ΡΠ΅ΠΌ, ΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π°ΠΉΡ ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ char Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ». Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» β Π±ΡΠΊΠ²Π° Π, ΠΊΠΎΡΠΎΡΠ°Ρ Π² unicode-ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 2 Π±Π°ΠΉΡΠ°, ΠΎ ΡΠ΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π² ΡΠΈΠΏ bytea. Π ΡΠΈΠΏ Β«charΒ» Π±Π΅ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ Π±Π°ΠΉΡ ΡΡΠΎΠ³ΠΎ unicode-ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. Π’ΠΎΠ³Π΄Π° Π·Π°ΡΠ΅ΠΌ ΡΡΠΎΡ ΡΠΈΠΏ Π½ΡΠΆΠ΅Π½? ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ 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)? ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ: Β«ΠΡΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ character ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΌΡ ΡΠΈΠΏΡ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡΠΈΠ΅ ΠΏΡΠΎΠ±Π΅Π»Ρ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡΒ». ΠΡΡ Π½Π΅Π»ΡΠ±ΠΎΠ²Ρ Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ. Π Π·Π°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΡΡΠΎΠΊΠΎΠ²Π°Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π² ΠΊΠ°Π²ΡΡΠΊΠ°Ρ ΡΡΠ°Π·Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΠΈΠΏΡ 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 ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π‘ΡΡΠ°Π½Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Π΅Π³ΠΎ ΠΏΡΠ°Π²ΠΎ.
ΠΠΎΡΡΠ΅ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΡΡΡΠ΅. date/time/timestamp
Π‘ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°ΡΡ/Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ°Π½Π½ΠΎΡΡΠΈ. ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Π½ΠΈΡ . Π‘ΡΠ°Π·Ρ ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΡ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌΠΈ, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ ΡΡΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΡΠΎΠ²ΡΠΌΠΈ ΠΏΠΎΡΡΠ°ΠΌΠΈ. ΠΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΌΠ° Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ.
ΠΠΎΡ ΡΠ²ΠΎΡ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ
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
Π ΡΠ΅ΠΌ Π΄Π΅Π»ΠΎ? Π ΡΠΎΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° timestamptz ΠΊ ΡΠΈΠΏΡ date ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° TimeZone, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠΉ ΠΎΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, Ρ.Π΅. ΠΈΠ·ΠΌΠ΅Π½ΡΠΈΠ²ΠΎΠΉ (volatile). Π’Π°ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ΅ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°Π΄ΠΎ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΡΠ°ΡΠΎΠ²ΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°.
ΠΠΎΠ³Π΄Π° now ΡΠΎΠ²ΡΠ΅ΠΌ Π΄Π°ΠΆΠ΅ Π½Π΅ now
ΠΡ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ, ΡΡΠΎ 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;
ΠΠ°ΡΠ°/Π²ΡΠ΅ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡΠ»ΠΎ Ρ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°! Π ΡΠ΅ΠΌ Π΄Π΅Π»ΠΎ? Π ΡΠΎΠΌ, ΡΡΠΎ now() β ΡΡΠΎ Π½Π΅ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, Π° Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°Π»Π° ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ. ΠΠΎΡΡΠΎΠΌΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ. ΠΡΠ±ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ Π²Π½Π΅ ΡΠ°ΠΌΠΎΠΊ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ΡΠ²Π½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΈ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠ°Π΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ΠΌΡ, Π²ΡΠ΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ SELECT now(); Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅-ΡΠΎ Π½Π΅ ΡΠ΅ΠΊΡΡΠ΅Π΅β¦ ΠΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΡΠ½ΠΎΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ clock_timestamp().
ΠΠΎΡΡΠ΅ Π½ΠΎΠΌΠ΅Ρ ΠΏΡΡΡ. bit
Strange a little bit
SELECT '111'::bit(4)
bit
bit(4)
------
1110
Π‘ ΠΊΠ°ΠΊΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π±ΠΈΡΡ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ°? ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΡΠ»Π΅Π²Π°. ΠΠΎ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π±Π°Π·Ρ Π½Π° ΡΡΠΎΡ ΡΡΠ΅Ρ Π΄ΡΡΠ³ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅. ΠΡΠ΄ΡΡΠ΅ ΠΎΡΡΠΎΡΠΎΠΆΠ½Ρ: ΠΏΡΠΈ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ°Π·ΡΡΠ΄ΠΎΠ² ΠΏΡΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠΈΠΏΠ° Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΎ, ΡΡΠΎ Ρ ΠΎΡΠ΅Π»ΠΈ. ΠΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊΠ°ΠΊ ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π±ΠΈΡΠΎΠ² ΡΠΏΡΠ°Π²Π°, ΡΠ°ΠΊ ΠΈ ΠΊ ΡΡΠ΅Π·Π°Π½ΠΈΡ Π±ΠΈΡΠΎΠ². Π’ΠΎΠΆΠ΅ ΡΠΏΡΠ°Π²Π°…
ΠΠΎΡΡΠ΅ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΡΡΡ. ΠΠ°ΡΡΠΈΠ²Ρ
ΠΠ°ΠΆΠ΅ NULL Π½Π΅ ΡΡΡΠ΅Π»ΡΠ½ΡΠ»
SELECT ARRAY[1, 2] || NULL
?column?
integer[]
---------
{1,2}
ΠΠ°ΠΊ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅ Π»ΡΠ΄ΠΈ, Π²ΠΎΡΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π½Π° SQL, ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ NULL. ΠΠΎ Π½Π΅ ΡΡΡ-ΡΠΎ Π±ΡΠ»ΠΎ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ². ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±Π°Π·Π° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ NULL ΠΊ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΈ Π½Π΅ΡΠ²Π½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ array_cat. ΠΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΡΠ½ΡΠΌ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎΡ Β«ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ²ΡΠΉ ΠΊΠΎΡΠΈΠΊΒ» Π½Π΅ ΠΎΠ±Π½ΡΠ»ΡΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ². Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΎΠΆΠ΅ Π½Π°Π΄ΠΎ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ.
ΠΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡΠΎΠ³. Π‘ΡΡΠ°Π½Π½ΠΎΡΡΠ΅ΠΉ Ρ Π²Π°ΡΠ°Π΅Ρ. ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· Π½ΠΈΡ , ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΊΡΠΈΡΠΈΡΠ½Ρ, ΡΡΠΎΠ±Ρ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ Π²ΠΎΠΏΠΈΡΡΠ΅ Π½Π΅Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ. Π Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠ±ΡΡΡΠ½ΡΡΡΡΡ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡΠΈ Π² ΡΠ΅Ρ ΠΈΠ»ΠΈ ΠΈΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡΡ . ΠΠΎ Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΡΡΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎ. ΠΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ ΠΎ Π½ΠΈΡ Π·Π½Π°ΡΡ. ΠΡΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ ΡΡΡΠ°Π½Π½ΠΎΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎΠ΅ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΡΠΈΠΏΠΎΠ², ΠΏΠΈΡΠΈΡΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ , Ρ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Ρ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ΡΡ Π½Π° Π½ΠΈΡ Π΄ΠΎΡΡΠ΅.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com