Awọn iru ifura

Ko si ohun ifura nipa irisi wọn. Pẹlupẹlu, wọn paapaa dabi ẹni ti o mọ ọ daradara ati fun igba pipẹ. Ṣugbọn iyẹn nikan titi o fi ṣayẹwo wọn. Eyi ni ibi ti wọn ṣe afihan iseda arekereke wọn, ti n ṣiṣẹ ni iyatọ patapata ju ti o nireti lọ. Ati nigba miiran wọn ṣe nkan ti o jẹ ki irun ori rẹ duro ni ipari - fun apẹẹrẹ, wọn padanu data aṣiri ti a fi le wọn lọwọ. Nigbati o ba koju wọn, wọn sọ pe awọn ko mọ ara wọn, biotilejepe ni ojiji wọn ṣiṣẹ takuntakun labẹ ibori kanna. O to akoko lati nipari mu wọn wá si omi mimọ. Jẹ ki a tun ṣe pẹlu awọn iru ifura wọnyi.

Titẹ data ni PostgreSQL, fun gbogbo ọgbọn rẹ, ma ṣe afihan awọn iyanilẹnu ajeji pupọ nigbakan. Ninu nkan yii a yoo gbiyanju lati ṣalaye diẹ ninu awọn quirks wọn, loye idi fun ihuwasi ajeji wọn ati loye bi a ko ṣe le lọ sinu awọn iṣoro ni iṣe ojoojumọ. Lati sọ otitọ, Mo ṣe akopọ nkan yii tun bi iru iwe itọkasi fun ara mi, iwe itọkasi ti o le ni irọrun tọka si ni awọn ọran ariyanjiyan. Nitorinaa, yoo tun kun bi awọn iyanilẹnu tuntun lati awọn iru ifura ti wa ni awari. Nitorinaa, jẹ ki a lọ, oh awọn olutọpa data ailopin!

Dossier nọmba ọkan. gidi / ė konge / nomba / owo

Yoo dabi pe awọn oriṣi nọmba jẹ iṣoro ti o kere julọ ni awọn ofin ti awọn iyanilẹnu ni ihuwasi. Sugbon ko si bi o ti jẹ. Nitorinaa jẹ ki a bẹrẹ pẹlu wọn. Nitorina…

Gbagbe bi o ṣe le ka

SELECT 0.1::real = 0.1

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

Kin o nsele? Iṣoro naa ni pe PostgreSQL ṣe iyipada 0.1 igbagbogbo ti a ko tẹ si ilọpo meji ati pe o gbiyanju lati ṣe afiwe rẹ pẹlu 0.1 ti iru gidi. Ati awọn wọnyi ni o wa patapata ti o yatọ itumo! Ero naa ni lati ṣe aṣoju awọn nọmba gidi ni iranti ẹrọ. Niwọn bi 0.1 ko le ṣe aṣoju bi ipin alakomeji ti o pari (yoo jẹ 0.0 (0011) ni alakomeji), awọn nọmba pẹlu awọn ijinle bit oriṣiriṣi yoo yatọ, nitorinaa abajade pe wọn ko dọgba. Ni gbogbogbo, eyi jẹ koko-ọrọ fun nkan lọtọ Emi kii yoo kọ ni alaye diẹ sii nibi.

Nibo ni aṣiṣe naa ti wa?

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

Ọpọlọpọ eniyan mọ pe PostgreSQL ngbanilaaye akiyesi iṣẹ-ṣiṣe fun iru simẹnti. Iyẹn ni, o le kọ kii ṣe 1 :: int nikan, ṣugbọn tun int (1), eyiti yoo jẹ deede. Ṣugbọn kii ṣe fun awọn oriṣi ti awọn orukọ wọn ni awọn ọrọ pupọ! Nitorinaa, ti o ba fẹ sọ iye nomba kan si iru konge ilọpo meji ni fọọmu iṣẹ, lo inagijẹ iru float8, iyẹn, Yan float8(1).

Kini o tobi ju ailopin lọ?

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

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

Ẹ wo bí ó ti rí! O wa ni jade nibẹ ni nkankan ti o tobi ju infinity, ati awọn ti o NaN! Ni akoko kanna, iwe-ipamọ PostgreSQL n wo wa pẹlu awọn oju otitọ ati pe o han gbangba pe NaN tobi ju nọmba miiran lọ, ati, nitorina, ailopin. Idakeji jẹ tun otitọ fun -NaN. Hello, isiro awọn ololufẹ! Ṣugbọn a gbọdọ ranti pe gbogbo eyi nṣiṣẹ ni ipo ti awọn nọmba gidi.

Yika oju

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

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

Ikini airotẹlẹ miiran lati ipilẹ. Lẹẹkansi, ranti pe ilọpo meji ati awọn oriṣi nọmba ni awọn ipa iyipo oriṣiriṣi. Fun nomba - awọn ibùgbé ọkan, nigbati 0,5 ti wa ni ti yika soke, ati fun ė konge - 0,5 ti wa ni ti yika si sunmọ ani odidi.

Owo jẹ nkan pataki

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

Gẹgẹbi PostgreSQL, owo kii ṣe nọmba gidi kan. Gẹgẹbi diẹ ninu awọn ẹni-kọọkan, paapaa. A nilo lati ranti pe sisọ iru owo naa ṣee ṣe nikan si oriṣi nọmba, gẹgẹ bi nọmba nọmba nikan ni a le sọ si iru owo naa. Ṣugbọn nisisiyi o le ṣere pẹlu rẹ bi ọkan rẹ ṣe fẹ. Ṣugbọn kii yoo jẹ owo kanna.

Smallint ati iran ọkọọkan

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 ko fẹran lati padanu akoko lori awọn nkan kekere. Kini awọn ilana wọnyi da lori smallint? int, ko kere! Nitorinaa, nigbati o ba n gbiyanju lati ṣiṣẹ ibeere ti o wa loke, ibi ipamọ data ngbiyanju lati sọ smallint si oriṣi odidi miiran, o rii pe o le jẹ ọpọlọpọ iru awọn simẹnti bẹẹ. Simẹnti wo ni lati yan? O ko le pinnu eyi, ati nitorinaa ipadanu pẹlu aṣiṣe kan.

Nọmba faili meji. "char"/char/varchar/ọrọ

A nọmba ti oddities ni o wa tun bayi ni ohun kikọ orisi. Jẹ ki a mọ wọn pẹlu.

Iru ẹtan wo ni wọnyi?

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

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

Iru "char" wo ni eyi, iru apanilerin wo ni eyi? A ko nilo awọn ... Nitoripe o ṣe bi ẹni pe o jẹ eedu lasan, botilẹjẹpe o wa ninu awọn agbasọ. Ati pe o yatọ si eedu deede, eyiti o jẹ laisi awọn agbasọ, ni pe o ṣe agbejade nikan baiti akọkọ ti aṣoju okun, lakoko ti eedu deede n ṣe agbejade ohun kikọ akọkọ. Ninu ọran wa, ohun kikọ akọkọ ni lẹta P, eyiti o wa ninu aṣoju unicode gba awọn baiti 2, gẹgẹbi ẹri nipa yiyipada abajade si iru bytea. Ati pe iru “char” gba nikan baiti akọkọ ti aṣoju unicode yii. Lẹhinna kilode ti iru iru yii nilo? Iwe PostgreSQL sọ pe eyi jẹ oriṣi pataki ti a lo fun awọn iwulo pataki. Nitorinaa a ko ṣeeṣe lati nilo rẹ. Ṣugbọn wo oju rẹ ati pe iwọ kii yoo ṣe aṣiṣe nigbati o ba pade rẹ pẹlu ihuwasi pataki rẹ.

Awọn aaye afikun. Ti oju, kuro ninu ọkan

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

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

Wo apẹẹrẹ ti a fifun. Mo ni pataki iyipada gbogbo awọn abajade si iru bytea, ki o han kedere ohun ti o wa nibẹ. Nibo ni awọn aaye itọpa lẹhin simẹnti si varchar(6)? Iwe naa sọ ni ṣoki pe: “Nigbati a ba sọ iye ti ohun kikọ silẹ si iru ohun kikọ miiran, itọpa aaye funfun jẹ asonu.” A gbọdọ ranti ikorira yii. Ati ki o ṣe akiyesi pe ti o ba jẹ simẹnti okun igbagbogbo ti a sọ taara si iru varchar(6), awọn aaye itọpa ti wa ni ipamọ. Iru ni awọn iṣẹ iyanu.

Nọmba faili mẹta. json/jsonb

JSON jẹ eto ti o yatọ ti o ngbe igbesi aye tirẹ. Nitorinaa, awọn nkan rẹ ati awọn ti PostgreSQL yatọ diẹ. Eyi ni awọn apẹẹrẹ.

Johnson ati Johnson. lero iyato

SELECT 'null'::jsonb IS NULL

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

Ohun naa ni pe JSON ni nkan asan ti tirẹ, eyiti kii ṣe afọwọṣe ti NULL ni PostgreSQL. Ni akoko kanna, ohun JSON funrararẹ le ni iye NULL daradara, nitorinaa ikosile SELECT null :: jsonb IS NULL (akiyesi isansa awọn agbasọ ẹyọkan) yoo pada ni otitọ ni akoko yii.

Ọkan lẹta ayipada ohun gbogbo

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

Ohun naa ni pe json ati jsonb jẹ awọn ẹya ti o yatọ patapata. Ni json, ohun naa ti wa ni ipamọ bi o ti jẹ, ati ni jsonb o ti wa ni ipamọ tẹlẹ ni irisi ti a ti sọ asọye, titọka itọka. Iyẹn ni idi ninu ọran keji, iye ohun naa nipasẹ bọtini 1 ti rọpo lati [1, 2, 3] si [7, 8, 9], eyiti o wa sinu eto ni ipari pupọ pẹlu bọtini kanna.

Maṣe mu omi lati oju rẹ

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

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

PostgreSQL ninu imuse JSONB rẹ ṣe iyipada ọna kika ti awọn nọmba gidi, mu wọn wa si fọọmu kilasika. Eyi ko ṣẹlẹ fun iru JSON. Ajeji diẹ, ṣugbọn o tọ.

Nọmba faili mẹrin. ọjọ / akoko / timestamp

Nibẹ ni o wa tun diẹ ninu awọn oddities pẹlu ọjọ/akoko orisi. Jẹ ki a wo wọn. Jẹ ki n ṣe ifiṣura lẹsẹkẹsẹ pe diẹ ninu awọn ẹya ihuwasi di mimọ ti o ba loye daradara ni pataki ti ṣiṣẹ pẹlu awọn agbegbe akoko. Ṣugbọn eyi tun jẹ koko-ọrọ fun nkan lọtọ.

Tire mi ko ye

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

Yoo dabi pe kini ko ni oye nibi? Ṣugbọn ibi ipamọ data ko tun loye ohun ti a fi si ibi akọkọ nibi-ọdun tabi ọjọ naa? Ó sì pinnu pé ọjọ́ kọkàndínlọ́gọ́rùn-ún ọdún 99 ni, èyí tó múnú rẹ̀ dùn. Ni gbogbogbo, nigbati o ba n gbejade awọn ọjọ ni ọna kika ọrọ, o nilo lati ṣayẹwo ni pẹkipẹki bawo ni data data ṣe mọ wọn daradara (ni pataki, ṣe itupalẹ paramita datestyle pẹlu aṣẹ ọjọ-ọjọ SHOW), nitori awọn ambiguities ninu ọran yii le jẹ gbowolori pupọ.

Nibo ni o ti gba eyi lati?

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

Kilode ti data data ko le loye akoko ti a sọ ni gbangba bi? Nitori agbegbe aago ko ni abbreviation, ṣugbọn orukọ kikun, eyiti o jẹ oye nikan ni ọrọ ti ọjọ kan, nitori pe o ṣe akiyesi itan-akọọlẹ ti awọn ayipada agbegbe akoko, ati pe ko ṣiṣẹ laisi ọjọ kan. Ati pe awọn ọrọ gangan ti laini akoko gbe awọn ibeere dide - kini olupilẹṣẹ tumọ gaan? Nitorinaa, ohun gbogbo jẹ ọgbọn nibi, ti o ba wo.

Kini aṣiṣe pẹlu rẹ?

Fojuinu ipo naa. O ni aaye kan ninu tabili rẹ pẹlu iru timestamptz. O fẹ lati ṣe atọka rẹ. Ṣugbọn o loye pe kikọ atọka lori aaye yii kii ṣe idalare nigbagbogbo nitori yiyan giga rẹ (fere gbogbo awọn iye ti iru yii yoo jẹ alailẹgbẹ). Nitorinaa o pinnu lati dinku yiyan ti atọka nipa sisọ iru si ọjọ kan. Ati pe o gba iyalẹnu kan:

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

Kin o nsele? Otitọ ni pe lati sọ iru timestamptz kan si iru ọjọ kan, iye ti paramita eto TimeZone ti lo, eyiti o jẹ ki iṣẹ iyipada iru da lori paramita aṣa, ie. iyipada. Iru awọn iṣẹ bẹẹ ko gba laaye ninu atọka. Ni idi eyi, o gbọdọ tọka ni gbangba ni agbegbe aago wo iru simẹnti naa ti ṣe.

Nigba ti bayi ni ko ani bayi ni gbogbo

A ti lo lati bayi () pada ọjọ/akoko lọwọlọwọ, ni akiyesi agbegbe aago naa. Ṣugbọn wo awọn ibeere wọnyi:

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;

Awọn ọjọ / akoko ti wa ni pada kanna ko si bi o Elo akoko ti koja niwon awọn ti tẹlẹ ìbéèrè! Kin o nsele? Otitọ ni pe bayi () kii ṣe akoko lọwọlọwọ, ṣugbọn akoko ibẹrẹ ti iṣowo lọwọlọwọ. Nitorinaa, ko yipada laarin idunadura naa. Eyikeyi ibeere ti a ṣe ifilọlẹ ni ita aaye ti idunadura kan ni a we sinu idunadura kan laisọfa, eyiti o jẹ idi ti a ko ṣe akiyesi pe akoko ti o pada nipasẹ yiyan ti o rọrun ni bayi (); ni otitọ, kii ṣe lọwọlọwọ… Ti o ba fẹ gba akoko lọwọlọwọ ooto, o nilo lati lo iṣẹ clock_timestamp().

Nọmba faili karun. die-die

Ajeji kekere kan

SELECT '111'::bit(4)

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

Apa wo ni o yẹ ki a ṣafikun awọn die-die ni ọran iru itẹsiwaju? O dabi pe o wa ni apa osi. Ṣugbọn ipilẹ nikan ni ero ti o yatọ lori ọran yii. Ṣọra: ti nọmba awọn nọmba ko ba baramu nigba simẹnti iru kan, iwọ kii yoo gba ohun ti o fẹ. Eyi kan si mejeeji fifi awọn die-die kun si apa ọtun ati awọn gige gige. Bakannaa ni apa ọtun ...

Nọmba faili mẹfa. Awọn akojọpọ

Paapaa NULL ko ina

SELECT ARRAY[1, 2] || NULL

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

Gẹgẹbi awọn eniyan deede dide lori SQL, a nireti abajade ikosile yii lati jẹ NULL. Ṣugbọn ko si nibẹ. Ohun orun ti wa ni pada. Kí nìdí? Nitoripe ninu ọran yii ipilẹ yoo sọ NULL si akojọpọ odidi kan ati pe o pe iṣẹ array_cat ni aitọ. Ṣugbọn o ṣi wa koyewa idi ti “ologbo orun” yii ko tun eto naa pada. Iwa yii tun nilo lati ranti nikan.

Ṣe akopọ. Nibẹ ni o wa opolopo ti ajeji ohun. Pupọ ninu wọn, nitorinaa, ko ṣe pataki bi lati sọrọ nipa ihuwasi ti ko yẹ. Ati awọn miiran ṣe alaye nipasẹ irọrun ti lilo tabi igbohunsafẹfẹ ti ilo wọn ni awọn ipo kan. Ṣugbọn ni akoko kanna, ọpọlọpọ awọn iyanilẹnu wa. Nitorina, o nilo lati mọ nipa wọn. Ti o ba ri ohunkohun miiran ajeji tabi dani ni ihuwasi ti eyikeyi iru, kọ ninu awọn comments, Emi yoo dun lati fi si awọn dossiers wa lori wọn.

orisun: www.habr.com

Fi ọrọìwòye kun