Ụdị enyo enyo

Ọ dịghị ihe na-enyo enyo banyere ọdịdị ha. Ọzọkwa, ha na-adịkwa ka ị maara nke ọma na ogologo oge. Mana nke ahụ bụ naanị ruo mgbe ịlele ha. Nke a bụ ebe ha na-egosipụta ọdịdị aghụghọ ha, na-arụ ọrụ dị iche iche karịa ka ị tụrụ anya ya. Ma mgbe ụfọdụ, ha na-eme ihe na-eme ka ntutu isi gị kwụ ọtọ - dịka ọmụmaatụ, ha na-efunahụ data nzuzo nke e nyefere ha n'aka. Mgbe ị na-eche ha ihu, ha na-ekwu na ha amaghị ibe ha, ọ bụ ezie na na ndò ha na-arụsi ọrụ ike n'okpuru otu mkpuchi. Oge eruola imecha weta ha na mmiri dị ọcha. Ka anyị na-emeso ụdị ndị a na-enyo enyo.

Ntinye data na PostgreSQL, maka ebumnuche ya niile, na-enye mgbe ụfọdụ ihe ịtụnanya dị ịtụnanya. N'isiokwu a, anyị ga-agbalị ịkọwapụta ụfọdụ n'ime ha quirks, ghọta ihe mere ha iju omume na ịghọta otú ọ bụghị na-agba ọsọ n'ime nsogbu na-adị kwa ụbọchị omume. Iji kwuo eziokwu, achịkọtara m akụkọ a ka ọ bụrụ ụdị akwụkwọ ntụaka maka onwe m, akwụkwọ ntụaka nke nwere ike ịkọwa ngwa ngwa n'okwu ndị na-ese okwu. Ya mere, a ga-ejupụta ya ka achọpụtara ihe ịtụnanya ọhụrụ sitere na ụdị enyo. Yabụ, ka anyị gaa, ndị na-ahụ maka nchekwa data na-adịghị agwụ agwụ!

Dossier nọmba nke mbụ. ezigbo / okpukpu abụọ nkenke / ọnụọgụ / ego

Ọ ga-adị ka ụdị ọnụọgụgụ kacha nwee nsogbu n'ihe gbasara ihe ịtụnanya na omume. Ma n'agbanyeghị otú ọ dị. Ya mere, ka anyị malite na ha. Yabụ…

Echefuru ka esi agụta ọnụ

SELECT 0.1::real = 0.1

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

Kedu ihe ọ bụ? Nsogbu bụ na PostgreSQL na-atụgharị 0.1 na-edeghị akwụkwọ mgbe niile ka ọ bụrụ nkenke okpukpu abụọ ma gbalịa iji ya tụnyere 0.1 nke ezigbo ụdị. Na ndị a bụ kpamkpam dị iche iche pụtara! Echiche bụ ịnọchite anya ọnụọgụ n'ezie na ebe nchekwa igwe. Ebe ọ bụ na 0.1 enweghị ike ịnọchite anya dị ka akụkụ ọnụọgụ abụọ nwere njedebe (ọ ga-abụ 0.0 (0011) na ọnụọgụ abụọ), ọnụọgụ nwere omimi dị iche iche ga-adị iche, ya mere nsonaazụ na ha enweghị nha. N'ikwu okwu n'ozuzu, nke a bụ isiokwu maka edemede dị iche; Agaghị m ede n'ụzọ zuru ezu ebe a.

Ebee ka njehie ahụ si abịa?

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

Ọtụtụ ndị mmadụ maara na PostgreSQL na-enye ohere nrụpụta ọrụ maka ụdị nkedo. Ya bụ, ị nwere ike dee ọ bụghị naanị 1 ::int, kamakwa int (1), nke ga-abụ otu. Mana ọ bụghị maka ụdị ndị aha ha nwere ọtụtụ okwu! Ya mere, ọ bụrụ na ịchọrọ ịtụba uru ọnụọgụ ka ọ bụrụ okpukpu abụọ nke ziri ezi n'ụdị arụ ọrụ, jiri utu aha nke ụdị float8 a, ya bụ, SELECT float8(1).

Kedu ihe kariri infinity?

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

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

Lee ka ọ dị! Ọ tụgharịrị na e nwere ihe karịrị enweghị ngwụcha, ma ọ bụ NaN! N'otu oge ahụ, akwụkwọ PostgreSQL na-ele anyị anya na anya eziokwu ma kwuo na NaN doro anya karịa ọnụọgụ ọ bụla ọzọ, na, ya mere, enweghi ngwụcha. Ihe megidere ya bụkwa eziokwu maka -NaN. Ndewo, ndị hụrụ mgbakọ na mwepụ! Ma anyị ga-echeta na ihe a niile na-arụ ọrụ na ọnọdụ nke ezigbo ọnụọgụgụ.

Anya okirikiri

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

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

Ekele ọzọ a na-atụghị anya ya site na isi. Ọzọ, cheta na nzizi okpukpu abụọ na ụdị ọnụọgụ nwere mmetụta okirikiri dị iche iche. Maka ọnụọgụgụ - nke a na-emebu, mgbe 0,5 na-agbakọta, na maka nkenke abụọ - 0,5 na-agbakọta n'akụkụ ọnụ ọgụgụ kacha nso.

Ego bụ ihe pụrụ iche

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

Dị ka PostgreSQL si kwuo, ego abụghị ezigbo nọmba. Dị ka ụfọdụ ndị mmadụ, kwa. Anyị kwesịrị icheta na nkedo ụdị ego ga-ekwe omume naanị n'ụdị ọnụọgụ, dịka naanị ụdị ọnụọgụ nwere ike ịtụba ụdị ego ahụ. Ma ugbu a ị nwere ike iji ya gwuo egwu dịka obi gị si chọọ. Ma ọ gaghị abụ otu ego ahụ.

Obere na usoro ọgbọ

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 anaghị amasị igbu oge na obere ihe. Kedu usoro ndị a dabere na obere obere? int, ọ dịghị obere! Ya mere, mgbe ị na-agbalị imezu ajụjụ a dị n'elu, nchekwa data na-agbalị ịtụba smallint n'ụdị integer ọzọ, wee hụ na enwere ike inwe ọtụtụ nkedo dị otú ahụ. Kedu ihe nkedo ịhọrọ? Ọ nweghị ike ikpebi nke a, yabụ na-adaba na mperi.

Nọmba faịlụ abụọ. "char"/char/varchar/ederede

Ọtụtụ ihe adịghị mma dịkwa na ụdị agwa. Ka anyị matakwa ha.

Kedu ụdị aghụghọ ndị a bụ?

SELECT 'ПЕТЯ'::"char"
     , 'ПЕТЯ'::"char"::bytea
     , 'ПЕТЯ'::char
     , 'ПЕТЯ'::char::bytea

 char  | bytea |    bpchar    | bytea
"char" | bytea | character(1) | bytea
-------+-------+--------------+--------
 ╨     | xd0  | П            | xd09f

Kedu ụdị "char" bụ nke a, olee ụdị ome ome bụ nke a? Anyị achọghị ndị ahụ ... N'ihi na ọ na-eme ka ọ bụrụ cha cha nkịtị, n'agbanyeghị na ọ dị na ntinye akwụkwọ. Ọ dị iche na cha cha mgbe niile, nke na-enweghị ngụpụta, n'ihi na ọ na-ewepụta naanị byte mbụ nke ihe nnọchianya nke eriri, ebe cha cha nkịtị na-ewepụta agwa mbụ. N'ọnọdụ anyị, agwa mbụ bụ mkpụrụedemede P, nke na-anọchi anya unicode na-ewe 2 bytes, dị ka egosipụtara site n'ịtụgharị nsonaazụ ya na ụdị bytea. Na ụdị “char” na-ewe naanị otet mbụ nke nnọchite anya unicode a. Yabụ kedu ihe kpatara achọrọ ụdị a? Akwụkwọ PostgreSQL na-ekwu na nke a bụ ụdị pụrụ iche ejiri maka mkpa pụrụ iche. Yabụ na anyị agaghị achọ ya. Ma leba anya n'anya ya, ị gaghị emehie mgbe ị zutere ya na omume ya pụrụ iche.

Oghere ndị ọzọ. Apụọ n'anya, pụọ n'uche

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

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

Tụlee ihe atụ e nyere. M pụrụ iche tụgharịrị niile arụpụta na ụdị bytea, nke mere na ọ na-ahụ anya nke ọma ihe dị n'ebe ahụ. Ebee ka oghere ndị dị n'azụ mgbe nkedo na varchar(6) dị? Akwụkwọ ahụ kwuru n'ụzọ dị nkenke: "Mgbe a na-atụba uru nke agwa n'ụdị agwa ọzọ, a na-atụfu trailing whitespace." Ekwesịrị icheta enweghị mmasị a. Ma mara na ọ bụrụ na a na-atụba eriri ogologo oge niile e hotara ozugbo na ụdị varchar(6), a na-echekwa oghere ndị ahụ. Otú ahụ ka ọrụ ebube dị.

Nọmba faịlụ atọ. json/jsonb

JSON bụ ihe dị iche iche na-ebi ndụ nke ya. Ya mere, ụlọ ọrụ ya na nke PostgreSQL dịtụ iche. Lee ihe atụ.

Johnson na Johnson. nwee mmetụta dị iche

SELECT 'null'::jsonb IS NULL

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

Ihe bụ na JSON nwere ihe efu nke ya, nke na-abụghị analogue nke NULL na PostgreSQL. N'otu oge ahụ, ihe JSON n'onwe ya nwere ike inwe uru NULL, yabụ okwu SELECT null :: jsonb IS NULL (rịba ama na enweghị otu okwu) ga-alaghachi n'eziokwu oge a.

Otu akwụkwọ ozi na-agbanwe ihe niile

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

Ihe bụ na json na jsonb bụ ụdị dị iche iche. Na json, a na-echekwa ihe ahụ dị ka ọ dị, na na jsonb a na-echekwa ya n'ụdị nke nzacha, indexed index. Ọ bụ ya mere n'okwu nke abụọ, uru nke ihe ahụ site na igodo 1 gbanwere site na [1, 2, 3] gaa na [7, 8, 9], bụ nke batara na njedebe ya na otu igodo ahụ.

Aṅụla mmiri n'ihu gị

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

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

PostgreSQL na mmejuputa JSONB ya na-agbanwe nhazi nke ọnụọgụgụ n'ezie, na-ebute ha n'ụdị oge gboo. Nke a anaghị eme maka ụdị JSON. Obere iju, ma o ziri ezi.

Faịlụ nọmba anọ. ụbọchị / oge / akara oge

Enwekwara ụfọdụ ihe jọgburu onwe ya na ụdị ụbọchị/oge. Ka anyị lee ha anya. Ka m mee ndoputa ozugbo na ụfọdụ njirimara omume ga-edo anya ma ọ bụrụ na ị ghọtara nke ọma isi ihe dị na mpaghara oge. Mana nke a bụkwa isiokwu maka edemede dị iche.

Nke m aghọtaghị

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

Ọ ga-adị ka ihe a na-apụghị ịghọta aghọta ebe a? Ma nchekwa data ka aghọtaghị ihe anyị na-etinye na mbụ ebe a-afọ ma ọ bụ ụbọchị? O wee kpebie na ọ bụ January 99, 2008, bụ́ nke na-agba ya ume. N'ikwu okwu n'ozuzu, mgbe ị na-ebufe ụbọchị n'ụdị ederede, ịkwesịrị iji nlezianya lelee ka nchekwa data siri mata ha (karịsịa, nyochaa usoro datestyle na iwu ụbọchị ụdị nke SHOW), ebe ọ bụ na enweghị mgbagha n'okwu a nwere ike ịdị oke ọnụ.

Ebee ka i si nweta ihe a?

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

Gịnị kpatara na nchekwa data enweghị ike ịghọta oge akọwapụtara nke ọma? N'ihi na mpaghara oge enweghị abbreviation, ma aha zuru ezu, nke na-eme ka uche naanị na ọnọdụ nke ụbọchị, ebe ọ bụ na ọ na-eburu n'uche akụkọ ihe mere eme nke mpaghara oge mgbanwe, na ọ naghị arụ ọrụ na-enweghị ụbọchị. Na kpọmkwem okwu nke ahịrị oge na-ewelite ajụjụ - gịnị ka onye mmemme pụtara n'ezie? Ya mere, ihe niile bụ ihe ezi uche dị na ya ebe a, ma ọ bụrụ na ị na-ele ya anya.

Gịnị na-eme ya?

Chegodị echiche banyere ọnọdụ ahụ. Ị nwere ubi na tebụl gị nwere ụdị timestamptz. Ị chọrọ ịdepụta ya. Mana ị ghọtara na iwulite ndeksi na mpaghara a anaghị akwado ya mgbe niile n'ihi oke nhọrọ ya (ihe fọrọ nke nta ka ọ bụrụ ụkpụrụ niile nke ụdị a ga-abụ ihe pụrụ iche). Ya mere, ị na-ekpebi ibelata selectivity nke index site na-atụgharị ụdị na a ụbọchị. Ma ị ga-enweta ihe ijuanya:

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

Kedu ihe ọ bụ? Nke bụ eziokwu bụ na ịtụba ụdị timestamptz na ụdị ụbọchị, a na-eji uru nke usoro usoro TimeZone, nke na-eme ka ọrụ ntụgharị ahụ dabere na nhazi omenala, ya bụ. na-agbanwe agbanwe. A naghị anabata ọrụ ndị dị otú ahụ na ndeksi. N'okwu a, ị ga-egosipụta nke ọma na mpaghara oge a na-eme ụdị nkedo.

Mgbe ugbu a abụghị ọbụna ugbu a ma ọlị

Anyị na-eji ugbu a () iweghachi ụbọchị/oge dị ugbu a, na-eburu n'uche mpaghara oge. Mana lee ajụjụ ndị a:

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;

A na-eweghachite ụbọchị/oge ahụ otu ihe n'agbanyeghị oge ole agafeela kemgbe arịrịọ gara aga! Kedu ihe ọ bụ? Nke bụ eziokwu bụ na ugbu a () abụghị oge ugbu a, mana mmalite oge nke azụmahịa dị ugbu a. Ya mere, ọ naghị agbanwe n'ime azụmahịa ahụ. Ajụjụ ọ bụla ewepụtara na-abụghị oke nke azụmahịa na-ekechi ya na azụmahịa n'ezoghị ọnụ, nke mere na anyị anaghị achọpụta na oge SELECT dị mfe weghachiri ugbu a (); N'ezie, ọ bụghị nke dị ugbu a ... Ọ bụrụ na ịchọrọ ịnweta oge n'eziokwu ugbu a, ịkwesịrị iji ọrụ clock_timestamp ().

Faịlụ nọmba ise. bit

Iju ntakịrị

SELECT '111'::bit(4)

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

Kedu akụkụ nke a ga-agbakwunye ibe n'ibe ma ọ bụrụ na ụdị ndọtị dị? Ọ dị ka ọ nọ n'aka ekpe. Mana naanị isi nwere echiche dị iche n'okwu a. Kpachara anya: ọ bụrụ na ọnụọgụ ọnụọgụ abụọ adabaghị mgbe ị na-atụgharị ụdị, ị gaghị enweta ihe ịchọrọ. Nke a na-emetụta ma ịgbakwunye ibe n'aka nri na trimming ibe n'ibe. Ọzọkwa n'aka nri...

Faịlụ nọmba isii. Nhazi

Ọbụna NULL agbaghị ọkụ

SELECT ARRAY[1, 2] || NULL

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

Dị ka ndị nkịtị zụlitere na SQL, anyị na-atụ anya na nsonaazụ nke okwu a ga-abụ efu. Ma ọ dịghị ebe ahụ. A na-eweghachite n'usoro. Gịnị kpatara? N'ihi na n'ọnọdụ a, ntọala na-atụba NULL n'usoro integer wee kpọọ ọrụ array_cat n'ezoghị ọnụ. Mana ọ ka edobeghị ihe kpatara “mbawa n'usoro” anaghị ewepụta usoro ahụ. Omume a dịkwa mkpa ka e cheta ya.

Nchịkọta. Enwere ọtụtụ ihe iju. Ọtụtụ n'ime ha, n'ezie, adịghị oke egwu nke na-ekwu maka omume na-ekwesịghị ekwesị n'ezoghị ọnụ. A na-akọwakwa ndị ọzọ site na ịdị mfe iji ma ọ bụ ugboro ole ha na-etinye n'ọnọdụ ụfọdụ. Mana n'otu oge ahụ, enwere ọtụtụ ihe ịtụnanya. Ya mere, i kwesịrị ịma gbasara ha. Ọ bụrụ na ịchọta ihe ọ bụla ọzọ dị ịtụnanya ma ọ bụ ihe na-adịghị ahụkebe na omume nke ụdị ọ bụla, dee na nkwupụta, m ga-enwe obi ụtọ ịgbakwunye na dossier dị na ha.

isi: www.habr.com

Tinye a comment