๊ทธ๋ค์ ์ธ๋ชจ์๋ ์์ฌ์ค๋ฌ์ด ๊ฒ์ด ์์ต๋๋ค. ๋์ฑ์ด ๊ทธ๋ค์ ๋น์ ์๊ฒ ์ค๋ซ๋์ ์น์ํด ๋ณด์ ๋๋ค. ํ์ง๋ง ๊ทธ๊ฑด ํ์ธํ๊ธฐ ์ ๊น์ง๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ณณ์ ๊ทธ๋ค์ด ์์ํ๋ ๊ฒ๊ณผ๋ ์์ ํ ๋ค๋ฅด๊ฒ ์๋ํ๋ ๊ตํํ ๋ณธ์ฑ์ ๋ณด์ฌ์ฃผ๋ ๊ณณ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋๋ก ๊ทธ๋ค์ ๋น์ ์ ๋จธ๋ฆฌ์นด๋ฝ์ ๊ณค๋์๊ฒ ๋ง๋๋ ์ผ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ทธ๋ค์ ๊ทธ๋ค์๊ฒ ๋งก๊ฒจ์ง ๋น๋ฐ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ฒ๋ฆฝ๋๋ค. ๋น์ ์ด ๊ทธ๋ค๊ณผ ๋ง์ฃผํ์ ๋, ๊ทธ๋ค์ ์๋ก๋ฅผ ๋ชจ๋ฅธ๋ค๊ณ ์ฃผ์ฅํ์ง๋ง, ๊ทธ๋ฆผ์ ์์์ ๊ทธ๋ค์ ๊ฐ์ ํ๋ ์๋์์ ๋ถ์ง๋ฐํ ์ผํฉ๋๋ค. ๋ง์นจ๋ด ๊นจ๋ํ ๋ฌผ๋ก ๊ฐ์ ธ์ฌ ์๊ฐ์ ๋๋ค. ์ด๋ฌํ ์์ฌ์ค๋ฌ์ด ์ ํ๋ ์ฒ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
PostgreSQL์ ๋ชจ๋ ๋ ผ๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ ์ ๋ ฅ์ ๋๋๋ก ๋งค์ฐ ์ด์ํ ๋๋ผ์์ ์ ์ฌํฉ๋๋ค. ์ด ๊ธ์์ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ํน์ดํ ์ ์ ๋ช ํํ ํ๊ณ , ๊ทธ๋ค์ ์ด์ํ ํ๋์ ์ด์ ๋ฅผ ์ดํดํ๊ณ , ์ผ์ ์ํ์์ ๋ฌธ์ ์ ๋ถ๋ช์น์ง ์๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ์ฌ์ค์ ๋งํ์๋ฉด, ๋๋ ์ด ๊ธ์ ๋ ์์ ์ ์ํ ์ผ์ข ์ ์ฐธ๊ณ ์, ๋ ผ๋์ด ๋๋ ์ฌ๊ฑด์์ ์ฝ๊ฒ ์ฐธ๊ณ ํ ์ ์๋ ์ฐธ๊ณ ์๋ก๋ ์์ฑํ๋ค. ๋ฐ๋ผ์ ์์ํ ์ ํ์ ์๋ก์ด ๋๋ผ์์ด ๋ฐ๊ฒฌ๋๋ฉด ๋ณด์ถฉ๋ฉ๋๋ค. ์, ๊ฐ์, ์ง์น ์ค ๋ชจ๋ฅด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ถ์ ๊ธฐ๋ค์ด์ฌ!
์๋ฅ XNUMX๋ฒ. ์ค์/๋ฐฐ์ ๋ฐ๋/์ซ์/๋
์ซ์ ์ ํ์ ํ๋์ ๋๋ผ์ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ์ ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ด๋ป๋ ์๊ด ์์ต๋๋ค. ๊ทธ๋ผ ๊ทธ๋ค๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋์โฆ
๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์์ด๋ฒ๋ ธ์ด์
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์ ์ฌ์ํ ์ผ์ ์๊ฐ์ ๋ญ๋นํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. Smallint๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๋ฌํ ์ํ์ค๋ ๋ฌด์์ ๋๊น? int, ๊ทธ ์ดํ๋ ์๋๋๋ค! ๋ฐ๋ผ์ ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๊ณ ํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ smallint๋ฅผ ๋ค๋ฅธ ์ ์ ์ ํ์ผ๋ก ์บ์คํ ํ๋ ค๊ณ ์๋ํ๋ฉฐ ์ด๋ฌํ ์บ์คํ ์ด ์ฌ๋ฌ ๊ฐ ์์ ์ ์์์ ํ์ธํฉ๋๋ค. ์ด๋ค ์บ์คํธ๋ฅผ ์ ํํ ๊ฒ์ธ๊ฐ? ๊ทธ๋ ๋ ์ด๋ฅผ ๊ฒฐ์ ํ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
ํ์ผ ๋ฒํธ XNUMX. "๋ฌธ์"/char/varchar/ํ ์คํธ
๋ฌธ์ ์ ํ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ํ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ค๋ ์์๋ด ์๋ค.
์ด๊ฒ์ ์ด๋ค ํธ๋ฆญ์ ๋๊น?
SELECT 'ะะะขะฏ'::"char"
, 'ะะะขะฏ'::"char"::bytea
, 'ะะะขะฏ'::char
, 'ะะะขะฏ'::char::bytea
char | bytea | bpchar | bytea
"char" | bytea | character(1) | bytea
-------+-------+--------------+--------
โจ | xd0 | ะ | xd09f
์ด๊ฒ์ ์ด๋ค ์ข ๋ฅ์ "char"์ด๊ณ , ์ด๊ฒ์ ์ด๋ค ์ข ๋ฅ์ ๊ด๋์ ๋๊น? ํ์ํ์ง ์์ต๋๋ค... ๋ฐ์ดํ๋ก ๋ฌถ์ด๋ ์ผ๋ฐ ๋ฌธ์์ธ ๊ฒ์ฒ๋ผ ๊ฐ์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ char์ ๋ฌธ์์ด ํํ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๋ง ์ถ๋ ฅํ๋ ๋ฐ๋ฉด ์ผ๋ฐ char์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ค๋ ์ ์์ ๋ฐ์ดํ๊ฐ ์๋ ์ผ๋ฐ char์ ๋ค๋ฆ ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ ๋ฌธ์ P์ ๋๋ค. ์ด๋ ๊ฒฐ๊ณผ๋ฅผ bytea ์ ํ์ผ๋ก ๋ณํํ์ฌ ์ ์ ์๋ฏ์ด ์ ๋์ฝ๋ ํํ์์ 2๋ฐ์ดํธ๋ฅผ ์ฐจ์งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ "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์ด PostgreSQL์ NULL๊ณผ ์ ์ฌํ์ง ์์ ๊ณ ์ ํ null ์ํฐํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋์์ 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}
JSONB ๊ตฌํ์ PostgreSQL์ ์ค์์ ํ์์ ๋ณ๊ฒฝํ์ฌ ์ด๋ฅผ ๊ณ ์ ์ ์ธ ํ์์ผ๋ก ๋ง๋ญ๋๋ค. JSON ์ ํ์์๋ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์กฐ๊ธ ์ด์ํ์ง๋ง ๊ทธ์ ๋ง์ด ๋ง์ต๋๋ค.
ํ์ผ ๋ฒํธ XNUMX. ๋ ์ง/์๊ฐ/ํ์์คํฌํ
๋ ์ง/์๊ฐ ์ ํ์๋ ๋ช ๊ฐ์ง ์ด์ํ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ค์ ์ดํด๋ณด์. ์๊ฐ๋ ์์ ์ ๋ณธ์ง์ ์ ์ดํดํ๋ฉด ์ผ๋ถ ํ๋ ๊ธฐ๋ฅ์ด ๋ช ํํด ์ง๋๋ก ์ฆ์ ์์ฝํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ํ ๋ณ๋์ ๊ธฐ์ฌ์ ๋ํ ์ฃผ์ ์ ๋๋ค.
๋๋ ๋น์ ์ ๊ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค
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์ XNUMX์ผ๋ก ๊ฒฐ์ ํ๊ณ ์ ๋ง ์ถฉ๊ฒฉ์ ๋ฐ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ์ง๋ฅผ ํ ์คํธ ํ์์ผ๋ก ์ ์กํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํด๋น ๋ ์ง๋ฅผ ์ผ๋ง๋ ์ ํํ๊ฒ ์ธ์ํ๋์ง ๋งค์ฐ ์ฃผ์ ๊น๊ฒ ํ์ธํด์ผ ํฉ๋๋ค(ํนํ SHOW datestyle ๋ช ๋ น์ ์ฌ์ฉํ์ฌ 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 ์ ํ์ ๋ ์ง ์ ํ์ผ๋ก ๋ณํํ๊ธฐ ์ํด 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;
์ด์ ์์ฒญ ์ดํ ์๊ฐ์ด ์ผ๋ง๋ ์ง๋ฌ๋์ง์ ๊ด๊ณ์์ด ๋ ์ง/์๊ฐ์ ๋์ผํ๊ฒ ๋ฐํ๋ฉ๋๋ค! ๋ฌด์จ ์ผ์ด์ผ? ์ฌ์ค now()๋ ํ์ฌ ์๊ฐ์ด ์๋๋ผ ํ์ฌ ํธ๋์ญ์ ์ ์์ ์๊ฐ์ ๋๋ค. ๋ฐ๋ผ์ ํธ๋์ญ์ ๋ด์์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํธ๋์ญ์ ๋ฒ์ ์ธ๋ถ์์ ์์๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ ์์์ ์ผ๋ก ํธ๋์ญ์ ์ ๋ํ๋๋ฏ๋ก ๊ฐ๋จํ SELECT now()์ ์ํด ๋ฐํ๋ ์๊ฐ์ ์ ์ ์์ต๋๋ค. ์ฌ์ค์ ํ์ฌ ์๊ฐ์ด ์๋๋๋ค... ์ ์งํ ํ์ฌ ์๊ฐ์ ์ป์ผ๋ ค๋ฉด clock_timestamp() ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ผ ๋ฒํธ XNUMX. ์กฐ๊ธ
์กฐ๊ธ ์ด์ํด์
SELECT '111'::bit(4)
bit
bit(4)
------
1110
์ ํ ํ์ฅ์ ๊ฒฝ์ฐ ์ด๋ ์ชฝ์ ๋นํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๊น? ์ผ์ชฝ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ์ ๋ํด์๋ ๊ธฐ์ง์์๋ง ๋ค๋ฅธ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฃผ์: ์ ํ์ ์บ์คํ ํ ๋ ์๋ฆฟ์๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด๋ ์ค๋ฅธ์ชฝ์ ๋นํธ๋ฅผ ์ถ๊ฐํ๊ณ ๋นํธ๋ฅผ ์๋ฅด๋ ๋ฐ ๋ชจ๋ ์ ์ฉ๋ฉ๋๋ค. ์ค๋ฅธ์ชฝ์๋...
ํ์ผ ๋ฒํธ XNUMX. ๋ฐฐ์ด
NULL๋ ์คํ๋์ง ์์์ต๋๋ค.
SELECT ARRAY[1, 2] || NULL
?column?
integer[]
---------
{1,2}
SQL์ ์ฌ์ฉํ๋ ์ผ๋ฐ ์ฌ๋๋ค๋ก์ ์ฐ๋ฆฌ๋ ์ด ํํ์์ ๊ฒฐ๊ณผ๊ฐ NULL์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ฑฐ๊ธฐ์ ์์์ต๋๋ค. ๋ฐฐ์ด์ด ๋ฐํ๋ฉ๋๋ค. ์? ์ด ๊ฒฝ์ฐ ๋ฒ ์ด์ค๋ NULL์ ์ ์ ๋ฐฐ์ด๋ก ์บ์คํ ํ๊ณ ์์์ ์ผ๋ก array_cat ํจ์๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด "array cat"์ด ์ ์ด๋ ์ด๋ฅผ ์ฌ์ค์ ํ์ง ์๋์ง๋ ์ฌ์ ํ ๋ถ๋ถ๋ช ํฉ๋๋ค. ์ด ํ๋๋ ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค.
์์ฝํ๋ค. ์ด์ํ ๊ฒ๋ค์ด ๋ง์ด ์์ต๋๋ค. ๋ฌผ๋ก ๊ทธ๋ค ์ค ๋๋ถ๋ถ์ ๋ ธ๊ณจ์ ์ผ๋ก ๋ถ์ ์ ํ ํ๋์ ๋ํด ์ด์ผ๊ธฐํ ๋งํผ ๋นํ์ ์ด์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ ์ฌ์ฉ์ ์ฉ์ด์ฑ์ด๋ ํน์ ์ํฉ์์์ ์ ์ฉ ๋น๋๋ก ์ค๋ช ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์์ ๋๋ผ์ด ์ผ๋ ๋ง์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ทธ๋ค์ ๋ํด ์์์ผํฉ๋๋ค. ์ด๋ค ์ ํ์ ๋์์์ ์ด์ํ๊ฑฐ๋ ํน์ดํ ์ ์ ๋ฐ๊ฒฌํ๋ฉด ์๊ฒฌ์ ์ ์ด์ฃผ์ธ์. ํด๋น ๋ฌธ์์ ๊ธฐ๊บผ์ด ์ถ๊ฐํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ถ์ฒ : habr.com