Mefuta e belaetsang

Ha ho letho le belaetsang ka ponahalo ea bona. Ho feta moo, ba bile ba bonahala ba u tseba hantle le ka nako e telele. Empa ke feela ho fihlela u li hlahloba. Mona ke moo ba bonts'ang tlhaho ea bona e bolotsana, ba sebetsa ka tsela e fapaneng ho feta kamoo u neng u lebelletse. 'Me ka linako tse ling ba etsa ntho e etsang hore moriri oa hau o eme - ka mohlala, ba lahleheloa ke data ea lekunutu e behiloeng tlhokomelong ea bona. Ha u tobana le bona, ba bolela hore ha ba tsebane, le hoja ka meriti ba sebetsa ka thata tlas'a sekoahelo se le seng. Ke nako ea hore qetellong u li tlise metsing a hloekileng. A re ke re sebetsane le mefuta ena e belaetsang.

Ho ngola lintlha ho PostgreSQL, bakeng sa mabaka ohle a eona, ka linako tse ling ho hlahisa lintho tse makatsang tse makatsang. Sehloohong sena re tla leka ho hlakisa tse ling tsa li-quirks tsa bona, ho utloisisa lebaka la boitšoaro ba bona bo makatsang le ho utloisisa hore na u se ke ua kena mathateng joang bophelong ba letsatsi le letsatsi. Ho bua 'nete, ke ile ka bokella sengoloa sena hape e le mofuta oa buka ea litšupiso bakeng sa ka, buka ea litšupiso eo ho ka buuoang ka eona habonolo litabeng tse tsosang khang. Ka hona, e tla tlatsoa hape ha lintho tse makatsang tse tsoang mefuteng e belaetsang li fumanoa. Kahoo, ha re eeng, oh li-trackers tsa database tse sa khathaleng!

Dossier nomoro ea pele. real/double precision/numeric/money

Ho ka bonahala eka mefuta ea linomoro ke eona e nang le bothata bo fokolang mabapi le lintho tse makatsang boitšoarong. Empa ho sa tsotellehe hore na ho joang. Kahoo a re qaleng ka bona. Kahoo…

U lebetse mokhoa oa ho bala

SELECT 0.1::real = 0.1

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

Bothata ke bofe? Bothata ke hore PostgreSQL e fetolela 0.1 e sa fetoheng hore e be e nepahetseng habeli mme e leka ho e bapisa le 0.1 ea mofuta oa 'nete. Mme tsena ke meelelo e fapaneng ka ho felletseng! Sepheo ke ho emela linomoro tsa sebele mohopolong oa mochine. Kaha 0.1 e ke ke ea emeloa e le karoloana e lekanyelitsoeng ea binary (e ka ba 0.0(0011) ho binary), lipalo tse nang le botebo bo fapaneng li tla fapana, kahoo sephetho sa hore ha li lekane. Ka kakaretso, sena ke sehlooho sa sengoloa se arohaneng; Nke ke ka ngola ka botlalo mona.

Phoso e tsoa hokae?

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

Batho ba bangata baa tseba hore PostgreSQL e lumella notation e sebetsang bakeng sa ho etsa mofuta oa mofuta. Ke hore, u ka ngola eseng feela 1::int, empa hape int(1), e tla lekana. Empa eseng bakeng sa mefuta eo mabitso a eona a nang le mantsoe a 'maloa! Ka hona, haeba u batla ho kenya boleng ba linomoro ho mofuta o nepahetseng habeli ka mokhoa o sebetsang, sebelisa li-alias tsa mofuta ona oa float8, ke hore, KHETHA float8(1).

Ke eng e kholo ho feta infinity?

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

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

Sheba hore na e joang! Hoa fumaneha hore ho na le ntho e kholo ho feta e sa feleng, 'me ke NaN! Ka nako e ts'oanang, litokomane tsa PostgreSQL li re sheba ka mahlo a tšepahalang 'me li bolela hore ho hlakile hore NaN e kholo ho feta palo e' ngoe le e 'ngoe, ka hona, e sa feleng. Se fapaneng ke 'nete hape bakeng sa -NaN. Lumelang, barati ba lipalo! Empa re tlameha ho hopola hore sena sohle se sebetsa molemong oa lipalo tsa 'nete.

Ho pota-pota ka mahlo

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

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

Tumeliso e 'ngoe e sa lebelloang e tsoang setsing. Hape, hopola hore ho nepahala habeli le mefuta ea linomoro li na le litlamorao tse fapaneng tsa ho potoloha. Bakeng sa linomoro - e tloaelehileng, ha 0,5 e pota-potiloe, 'me bakeng sa ho nepahala ha habeli - 0,5 e pota-potiloe ho ea ho palo e haufi.

Chelete ke ntho e khethehileng

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

Ho latela PostgreSQL, chelete ha se palo ea 'nete. Ho ea ka batho ba bang, hape. Re lokela ho hopola hore ho lahla mofuta oa chelete ho ka khoneha feela ho mofuta oa linomoro, feela joalokaha mofuta oa linomoro o ka lahleloa mofuteng oa chelete. Empa joale u ka bapala ka eona kamoo pelo ea hau e lakatsang kateng. Empa e ke ke ea ba chelete e tšoanang.

Moloko o monyenyane le o latellanang

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 ha e rate ho senya nako linthong tse nyane. Tatelano tsee tse ipapisitseng le tse nyane ke life? int, ha ho joalo! Ka hona, ha u leka ho etsa potso e ka holimo, polokelo ea boitsebiso e leka ho hlahisa ntho e nyenyane ho mofuta o mong oa palo e feletseng, 'me e bona hore ho ka ba le lihlopha tse' maloa tse joalo. Ke samente efe eo u ka e khethang? Ha a khone ho etsa qeto ka sena, ka hona o oela ka phoso.

Faele nomoro ea bobeli. "char"/char/varchar/text

Ho boetse ho na le lintho tse ngata tse sa tloaelehang mefuteng ea litlhaku. A re ba tsebeng le bona.

Maqheka ana ke a mofuta ofe?

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

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

Ke mofuta ofe oa "char" oo, ke motlatlapi oa mofuta ofe? Ha re hloke tseo ... Hobane e iketsa eka ke char e tloaelehileng, leha e le ka mantsoe a qotsitsoeng. 'Me e fapane le char e tloaelehileng, e se nang mantsoe a qotsitsoeng, ka hore e hlahisa feela li-byte tsa pele tsa setšoantšo sa khoele, ha char e tloaelehileng e hlahisa sebopeho sa pele. Tabeng ea rona, sebopeho sa pele ke tlhaku P, eo ka boemeli ba unicode e nkang li-byte tse 2, joalokaha ho pakoa ke ho fetola sephetho ho mofuta oa bytea. 'Me mofuta oa "char" o nka feela li-byte tsa pele tsa setšoantšo sena sa unicode. Joale ke hobane'ng ha mofuta ona o hlokahala? Litokomane tsa PostgreSQL li re ona ke mofuta o ikhethileng o sebelisetsoang litlhoko tse ikhethang. Kahoo ha ho bonolo hore re e hloke. Empa sheba mahlong a hae 'me u ke ke ua etsa phoso ha u kopana le eena ka boitšoaro ba hae bo khethehileng.

Libaka tse eketsehileng. Ho tloha ponong, ho tsoa kelellong

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

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

Sheba mohlala o fanoeng. Ke fetotse liphetho tsohle ka ho khetheha mofuta oa bytea, e le hore ho ka bonahala ka ho hlaka se neng se le teng. Li hokae libaka tse latelang ka mor'a ho lahlela ho varchar(6)? Litokomane li re ka bokhutšoanyane: "Ha u lahlela boleng ba sebopeho mofuteng o mong oa sebapali, sebaka se sesoeu se latelang se lahloa." Ho se rate hona ho tlameha ho hopoloa. Mme hlokomela hore haeba mohala o qotsitsoeng o qotsoa ka kotloloho ho mofuta oa varchar(6), libaka tse latelang lia bolokeha. Mehlolo e joalo.

Nomoro ea faele ea boraro. json/jsonb

JSON ke sebopeho se arohaneng se phelang bophelo ba sona. Ka hona, mekhatlo ea eona le ea PostgreSQL e fapane hanyane. Mehlala ke ena.

Johnson le Johnson. utloa phapang

SELECT 'null'::jsonb IS NULL

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

Taba ke hore JSON e na le ntho ea eona e se nang thuso, eo e seng analogue ea NULL ho PostgreSQL. Ka nako e ts'oanang, ntho ea JSON ka boeona e kanna ea ba le boleng ba NULL, ka hona polelo KHETHA null ::jsonb IS NULL (hlokomela ho ba sieo ha mantsoe a le mong) e tla khutla ka nako ena.

Lengolo le le leng le fetola tsohle

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

Taba ke hore json le jsonb ke meaho e fapaneng ka ho felletseng. Ho json, ntho e bolokoa joalo ka ha e le joalo, 'me ho jsonb e se e bolokiloe ka sebopeho sa sebopeho se arotsoeng, se nang le indexed. Ke kahoo tabeng ea bobeli, boleng ba ntho ka senotlolo 1 bo ileng ba nkeloa sebaka ho tloha ho [1, 2, 3] ho ea ho [7, 8, 9], e ileng ea kena mohahong qetellong ka senotlolo se tšoanang.

U se ke ua noa metsi sefahlehong sa hao

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

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

PostgreSQL ts'ebetsong ea eona ea JSONB e fetola sebopeho sa linomoro tsa 'nete, e li tlisa ka mokhoa oa khale. Sena ha se etsahale bakeng sa mofuta oa JSON. Ntho e makatsang, empa o nepile.

Nomoro ea faele ea bone. letsatsi/nako/setempe sa nako

Ho boetse ho na le lintho tse sa tloaelehang ka mefuta ea matsatsi / nako. A re ba shebeng. E-re ke behelle hang hang hore likarolo tse ling tsa boitšoaro li hlake haeba u utloisisa hantle moelelo oa ho sebetsa ka libaka tsa nako. Empa sena hape ke sehlooho sa sengoloa se arohaneng.

Tsa hao ha di utlwisise

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

Ho ka bonahala eka ke eng e sa utloisiseheng mona? Empa database e ntse e sa utloisise hore na re beha eng pele mona - selemo kapa letsatsi? 'Me o etsa qeto ea hore ke la 99 January, 2008, e leng se ileng sa mo ferekanya maikutlo. Ka kakaretso, ha o fetisa matsatsi ka mokhoa oa mongolo, o hloka ho hlahloba ka hloko hore na database e li hlokometse joang (haholo-holo, sekaseka paramethara ea datestyle ka taelo ea SHOW datestyle), kaha ho se hlaka tabeng ena ho ka bitsa chelete e ngata haholo.

Sena u se fumane kae?

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

Hobaneng ha database e sa utloisise nako e boletsoeng ka ho hlaka? Hobane sebaka sa nako ha se na khutsufatso, empa lebitso le felletseng, le utloahalang feela maemong a letsatsi, kaha le nka nalane ea liphetoho tsa sebaka sa nako, 'me ha e sebetse ntle le letsatsi. 'Me mantsoe a tatellano ea liketsahalo a hlahisa lipotso - hantle-ntle moqapi o ne a bolela'ng? Ka hona, ntho e 'ngoe le e' ngoe e utloahala mona, haeba u e sheba.

Phoso ke efe ka yena?

Nahana ka boemo. U na le tšimo tafoleng ea hau e nang le mofuta oa timestamptz. U batla ho e indexa. Empa ua utloisisa hore ho haha ​​index tšimong ena hase kamehla ho lokafatsang ka lebaka la khetho ea eona e phahameng (hoo e batlang e le litekanyetso tsohle tsa mofuta ona li tla ikhetha). Kahoo u nka qeto ea ho fokotsa khetho ea index ka ho beha mofuta ho letsatsi. 'Me u fumana ntho e makatsang:

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

Bothata ke bofe? 'Nete ke hore ho lahlela mofuta oa timestamptz ho mofuta oa letsatsi, boleng ba parameter ea tsamaiso ea TimeZone e sebelisoa, e leng se etsang hore mofuta oa phetoho ea mofuta o itšetlehile ka parameter e tloaelehileng, ke hore. feto-fetoha. Mesebetsi e joalo ha ea lumelloa ho index. Tabeng ena, o tlameha ho bontša ka ho hlaka hore na mofuta oa nako o etsoa hokae.

Ha e se e le hona joale ho hang

Re tloaetse ho () ho khutlisa letsatsi / nako ea hajoale, re ela hloko sebaka sa nako. Empa sheba lipotso tse latelang:

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;

Letsatsi/nako e khutlisetsoa ka mokhoa o ts'oanang ho sa tsotelehe hore na ho fetile nako e kae ho tloha kopo e fetileng! Bothata ke bofe? 'Nete ke hore hona joale () ha se nako ea hona joale, empa ke nako ea ho qala ea transaction ea hona joale. Ka hona, ha e fetohe ka har'a transaction. Potso efe kapa efe e hlahisitsoeng ka ntle ho sebaka sa khoebo e phuthetsoe ka mokhoa o hlakileng, ke ka lebaka leo re sa hlokomeleng hore nako e khutlisitsoeng ka KHETHA e bonolo hona joale(); ha e le hantle, eseng ea hona joale ... Haeba u batla ho fumana nako ea hona joale e tšepahalang, u lokela ho sebelisa mosebetsi oa clock_timestamp ().

Nomoro ea faele ea bohlano. hanyane

E makatsang hanyane

SELECT '111'::bit(4)

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

Ke lehlakore lefe le lokelang ho eketsoa li-bits haeba ho na le katoloso ea mofuta? E bonahala e le ka ho le letšehali. Empa ke motheo feela o nang le maikutlo a fapaneng tabeng ena. Hlokomela: haeba palo ea linomoro e sa lumellane ha u etsa mofuta, u ke ke ua fumana seo u se batlang. Sena se sebetsa ho bobeli ba ho eketsa likotoana ho le letona le ho fokotsa likotoana. Hape ka ho le letona...

Nomoro ea faele ea botšelela. Lihlopha

Esita le NULL ha ea ka ea thunya

SELECT ARRAY[1, 2] || NULL

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

Joalo ka batho ba tloaelehileng ba phahamisitsoeng ho SQL, re lebelletse hore sephetho sa polelo ena e be NULL. Empa e ne e le sieo. Ho khutlisetsoa lethathamo. Hobaneng? Hobane tabeng ena setsi se hlahisa NULL ho palo e feletseng 'me ka mokhoa o hlakileng o bitsa mosebetsi oa array_cat. Empa ho ntse ho sa tsejoe hantle hore na ke hobane'ng ha "katse e ngata" e sa hlophise sehlopha hape. Boitšoaro bona le bona bo hloka ho hopoloa feela.

Akaretsa. Ho na le lintho tse ngata tse makatsang. Bongata ba bona, ha e le hantle, ha ba nyatsa-nyatse hoo ba ka buang ka boitšoaro bo sa lokelang. 'Me tse ling li hlalosoa ka boiketlo ba tšebeliso kapa makhetlo a mangata a ho sebelisoa ha tsona maemong a itseng. Empa ka nako e ts'oanang, ho na le lintho tse ngata tse makatsang. Ka hona, o hloka ho tseba ka bona. Haeba u fumana ntho leha e le efe e sa tloaelehang kapa e sa tloaelehang boitšoarong ba mefuta leha e le efe, ngola litlhalosong, ke tla thabela ho eketsa li-dossiers tse fumanehang ho tsona.

Source: www.habr.com

Eketsa ka tlhaloso