์˜์‹ฌ์Šค๋Ÿฌ์šด ์œ ํ˜•

๊ทธ๋“ค์˜ ์™ธ๋ชจ์—๋Š” ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”์šฑ์ด ๊ทธ๋“ค์€ ๋‹น์‹ ์—๊ฒŒ ์˜ค๋žซ๋™์•ˆ ์นœ์ˆ™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ํ™•์ธํ•˜๊ธฐ ์ „๊นŒ์ง€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ณณ์€ ๊ทธ๋“ค์ด ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๊ณผ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ตํ™œํ•œ ๋ณธ์„ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋•Œ๋•Œ๋กœ ๊ทธ๋“ค์€ ๋‹น์‹ ์˜ ๋จธ๋ฆฌ์นด๋ฝ์„ ๊ณค๋‘์„œ๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๋“ค์€ ๊ทธ๋“ค์—๊ฒŒ ๋งก๊ฒจ์ง„ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๋“ค๊ณผ ๋งˆ์ฃผํ–ˆ์„ ๋•Œ, ๊ทธ๋“ค์€ ์„œ๋กœ๋ฅผ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ, ๊ทธ๋ฆผ์ž ์†์—์„œ ๊ทธ๋“ค์€ ๊ฐ™์€ ํ›„๋“œ ์•„๋ž˜์—์„œ ๋ถ€์ง€๋Ÿฐํžˆ ์ผํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ๊นจ๋—ํ•œ ๋ฌผ๋กœ ๊ฐ€์ ธ์˜ฌ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์œ ํ˜•๋„ ์ฒ˜๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€