ΠŸΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹

Π’ ΠΈΡ… внСшнСм ΠΎΠ±Π»ΠΈΠΊΠ΅ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π½ΠΈΠΉ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ Π΄Π°ΠΆΠ΅ каТутся Ρ‚Π΅Π±Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Π΄Π°Π²Π½ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌΠΈ. Но это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‚Ρ‹ ΠΈΡ… Π½Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡˆΡŒ. Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚-Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈ проявят свою ΠΊΠΎΠ²Π°Ρ€Π½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, сработав совсСм Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ‚Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π». А ΠΈΠ½ΠΎΠ³Π΄Π° Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΎΠ΅, ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ волосы просто Π²ΡΡ‚Π°ΡŽΡ‚ Π΄Ρ‹Π±ΠΎΠΌ β€” ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‚Π΅Ρ€ΡΡŽΡ‚ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΈΠΌ сСкрСтныС Π΄Π°Π½Π½Ρ‹Π΅. Когда Ρ‚Ρ‹ дСлаСшь ΠΈΠΌ ΠΎΡ‡Π½ΡƒΡŽ ставку, ΠΎΠ½ΠΈ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π½Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, хотя Π² Ρ‚Π΅Π½ΠΈ усСрдно трудятся ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ»ΠΏΠ°ΠΊΠΎΠΌ. ΠŸΠΎΡ€Π° ΡƒΠΆΠ΅ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ вывСсти ΠΈΡ… Π½Π° Ρ‡ΠΈΡΡ‚ΡƒΡŽ Π²ΠΎΠ΄Ρƒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ ΠΈ ΠΌΡ‹ разбСрСмся с этими ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ.

Випизация Π΄Π°Π½Π½Ρ‹Ρ… Π² 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