| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ðлава 8. Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ | След. |
8.3. СимволÑнÑе ÑипÑ
ТаблиÑа 8-4. СимволÑнÑе ÑипÑ
| ÐÐ¼Ñ | ÐпиÑание |
|---|---|
| character varying(n), varchar(n) | ÑÑÑока огÑаниÑенной пеÑеменной Ð´Ð»Ð¸Ð½Ñ |
| character(n), char(n) | ÑÑÑока ÑикÑиÑованной длинÑ, Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð½Ð°Ñ Ð¿Ñобелами |
| text | ÑÑÑока неогÑаниÑенной пеÑеменной Ð´Ð»Ð¸Ð½Ñ |
РТаблиÑе 8-4 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑимволÑнÑе ÑÐ¸Ð¿Ñ Ð¾Ð±Ñего назнаÑениÑ, доÑÑÑпнÑе в PostgreSQL.
SQL опÑеделÑÐµÑ Ð´Ð²Ð° оÑновнÑÑ ÑимволÑнÑÑ Ñипа: character varying(n) и character(n), где n — положиÑелÑное ÑиÑло. Ðба ÑÑи Ñипа могÑÑ Ñ ÑаниÑÑ ÑекÑÑовÑе ÑÑÑоки длиной до n Ñимволов (не байÑ). ÐопÑÑка ÑÐ¾Ñ ÑаниÑÑ Ð² колонке Ñакого Ñипа более длиннÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑиведÑÑ Ðº оÑибке, еÑли ÑолÑко вÑе лиÑние ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ðµ ÑвлÑÑÑÑÑ Ð¿Ñобелами (Ñогда они бÑдÑÑ ÑÑеÑÐµÐ½Ñ Ð´Ð¾ макÑималÑно допÑÑÑимой длинÑ). (ÐÑо неÑколÑко ÑÑÑанное иÑклÑÑение пÑодикÑовано ÑÑандаÑÑом SQL.) ÐÑли длина ÑÐ¾Ñ ÑанÑемой ÑÑÑоки оказÑваеÑÑÑ Ð¼ÐµÐ½ÑÑе обÑÑвленной, знаÑÐµÐ½Ð¸Ñ Ñипа character бÑдÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑÑ Ð¿Ñобелами; а Ñип character varying пÑоÑÑо ÑÐ¾Ñ ÑÐ°Ð½Ð¸Ñ ÐºÐ¾ÑоÑкÑÑ ÑÑÑокÑ.
ÐÑи попÑÑке Ñвно пÑивеÑÑи знаÑение к ÑÐ¸Ð¿Ñ character varying(n) или character(n), ÑаÑÑÑ ÑÑÑоки, вÑÑ Ð¾Ð´ÑÑÐ°Ñ Ð·Ð° гÑаниÑÑ Ð² n Ñимволов, ÑдалÑеÑÑÑ, не вÑзÑÐ²Ð°Ñ Ð¾Ñибки. (ÐÑо Ñакже пÑодикÑовано ÑÑандаÑÑом SQL.)
ÐапиÑи varchar(n) и char(n) ÑвлÑÑÑÑÑ Ñинонимами character varying(n) и character(n), ÑооÑвеÑÑÑвенно. ÐапиÑи character без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ ÑооÑвеÑÑÑвÑÐµÑ character(1). ÐÑли же длина не ÑказÑваеÑÑÑ Ð´Ð»Ñ character varying, ÑÑÐ¾Ñ Ñип бÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑÑÑоки лÑбого ÑазмеÑа. ÐÑо поведение ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.
Ðомимо ÑÑого, PostgreSQL пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ñип text, в коÑоÑом можно Ñ ÑаниÑÑ ÑÑÑоки пÑоизволÑной длинÑ. ХоÑÑ Ñип text не опиÑан в ÑÑандаÑÑе SQL, его поддеÑживаÑÑ Ð¸ некоÑоÑÑе дÑÑгие СУÐÐ SQL.
ÐнаÑÐµÐ½Ð¸Ñ Ñипа character ÑизиÑеÑки дополнÑÑÑÑÑ Ð¿Ñобелами до n Ñимволов и Ñ ÑанÑÑÑÑ, а заÑем оÑобÑажаÑÑÑÑ Ð² Ñаком виде. Ðднако пÑи ÑÑавнении двÑÑ Ð·Ð½Ð°Ñений Ñипа character дополнÑÑÑие пÑÐ¾Ð±ÐµÐ»Ñ ÑÑиÑаÑÑÑÑ Ð½ÐµÐ·Ð½Ð°ÑаÑими и игноÑиÑÑÑÑÑÑ. С пÑавилами ÑоÑÑиÑовки, где пÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑвлÑÑÑÑÑ Ð·Ð½Ð°ÑаÑими, ÑÑо поведение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ðº неожиданнÑм ÑезÑлÑÑаÑам, напÑÐ¸Ð¼ÐµÑ SELECT 'a '::CHAR(2) collate "C" < 'a\n'::CHAR(2) веÑнÑÑ true (ÑÑловие бÑÐ´ÐµÑ Ð¸ÑÑиннÑм). ÐÑи пÑеобÑазовании знаÑÐµÐ½Ð¸Ñ character к дÑÑÐ³Ð¾Ð¼Ñ ÑимволÑÐ½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð¾ÑбÑаÑÑваÑÑÑÑ. ÐамеÑÑÑе, ÑÑо ÑÑи пÑÐ¾Ð±ÐµÐ»Ñ Ð½ÐµÑÑÑ ÑмÑÑловÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð² ÑÐ¸Ð¿Ð°Ñ character varying и text, а Ñакже Ð´Ð»Ñ Ð¿ÑовеÑок по Ñаблонам LIKE и ÑегÑлÑÑнÑм вÑÑажениÑм.
ÐÐ»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑкой ÑÑÑоки (до 126 байÑ) ÑÑебÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй 1 Ð±Ð°Ð¹Ñ Ð¿Ð»ÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ñамой ÑÑÑоки, вклÑÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð´Ð»Ñ Ñипа character. ÐÐ»Ñ ÑÑÑок длиннее ÑÑебÑеÑÑÑ Ð½Ðµ 1, а 4 дополниÑелÑнÑÑ Ð±Ð°Ð¹Ñа. СиÑÑема Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки ÑжимаÑÑ Ð´Ð»Ð¸Ð½Ð½Ñе ÑÑÑоки, Ñак ÑÑо ÑизиÑеÑкий ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° диÑке Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼ÐµÐ½ÑÑе. ÐÑÐµÐ½Ñ Ð´Ð»Ð¸Ð½Ð½Ñе ÑекÑÑовÑе ÑÑÑоки пеÑеноÑÑÑÑÑ Ð² оÑделÑнÑе ÑаблиÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ не замедлÑли ÑабоÑÑ Ñ Ð´ÑÑгими колонками. РлÑбом ÑлÑÑае, макÑималÑно возможнÑй ÑÐ°Ð·Ð¼ÐµÑ ÑÑÑоки ÑоÑÑавлÑÐµÑ Ð¾ÐºÐ¾Ð»Ð¾ 1 ÐÐ. (ÐопÑÑÑимое знаÑение n в обÑÑвлении Ñипа даннÑÑ Ð¼ÐµÐ½ÑÑе ÑÑого ÑиÑла. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо в завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки каждÑй Ñимвол Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð½ÐµÑколÑко байÑ. ÐÑли Ð²Ñ Ð¶ÐµÐ»Ð°ÐµÑе ÑÐ¾Ñ ÑанÑÑÑ ÑÑÑоки без опÑеделÑнного пÑедела длинÑ, иÑполÑзÑйÑе ÑÐ¸Ð¿Ñ text или character varying без ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ, а не задавайÑе какое-либо болÑÑое макÑималÑное знаÑение.)
ÐодÑказка: Ðо бÑÑÑÑодейÑÑÐ²Ð¸Ñ ÑÑи ÑÑи Ñипа пÑакÑиÑеÑки не оÑлиÑаÑÑÑÑ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга, не ÑÑиÑÐ°Ñ Ð±Ð¾Ð»ÑÑего ÑазмеÑа Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипа Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑими пÑобелами и неÑколÑÐºÐ¸Ñ Ð¼Ð°ÑиннÑÑ Ð¾Ð¿ÐµÑаÑий Ð´Ð»Ñ Ð¿ÑовеÑки Ð´Ð»Ð¸Ð½Ñ Ð¿Ñи ÑÐ¾Ñ Ñанении ÑÑÑок в колонке Ñ Ð¾Ð³ÑаниÑенной длиной. ХоÑÑ Ð² некоÑоÑÑÑ Ð¡Ð£ÐÐ Ñип character(n) ÑабоÑÐ°ÐµÑ Ð±ÑÑÑÑее дÑÑÐ³Ð¸Ñ , в PostgreSQL ÑÑо не Ñак; на деле character(n) обÑÑно оказÑваеÑÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ оÑÑалÑнÑÑ Ñипов из-за болÑÑего ÑазмеÑа даннÑÑ . РболÑÑинÑÑве ÑлÑÑаев вмеÑÑо него лÑÑÑе пÑименÑÑÑ text или character varying.
ÐодÑобнее ÑинÑакÑÐ¸Ñ ÑекÑÑовÑÑ ÑÑÑок опиÑан в ÐодÑазделе 4.1.2.1, а доÑÑÑпнÑе опеÑаÑоÑÑ Ð¸ ÑÑнкÑии пеÑеÑиÑлÑÑÑÑÑ Ð² Ðлаве 9. ÐодиÑовка, иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑекÑÑовÑÑ ÑÑÑок, опÑеделÑеÑÑÑ Ð½Ð°Ð±Ð¾Ñом Ñимволов, вÑбÑаннÑм Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐодÑобнее ÑÑо опиÑано в Разделе 22.3.
ÐÑÐ¸Ð¼ÐµÑ 8-1. ÐÑполÑзование ÑимволÑнÑÑ Ñипов
CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
a | char_length
------+-------------
ok | 2
CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('good ');
INSERT INTO test2 VALUES ('too long');
ÐШÐÐÐÐ: знаÑение не ÑмеÑаеÑÑÑ Ð² Ñип character varying(5)
INSERT INTO test2 VALUES ('too long'::varchar(5)); -- Ñвное ÑÑеÑение
SELECT b, char_length(b) FROM test2;
b | char_length
-------+-------------
ok | 2
good | 5
too l | 5- (1)
- ФÑнкÑиÑ
char_lengthÑаÑÑмаÑÑиваеÑÑÑ Ð² Разделе 9.4.
Ð PostgreSQL еÑÑÑ ÐµÑÑ Ð´Ð²Ð° ÑимволÑнÑÑ Ñипа ÑикÑиÑованной длинÑ, пÑиведÑннÑе в ТаблиÑе 8-5. Тип name Ñоздан ÑолÑко Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов во внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑиÑÑемнÑÑ ÑаблиÑÐ°Ñ Ð¸ не пÑедназнаÑен Ð´Ð»Ñ Ð¾Ð±ÑÑного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑми. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÐµÐ³Ð¾ длина ÑоÑÑавлÑÐµÑ 64 байÑа (63 ASCII-Ñимвола плÑÑ ÐºÐ¾Ð½ÐµÑнÑй знак), но в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде C она задаÑÑÑÑ ÐºÐ¾Ð½ÑÑанÑой NAMEDATALEN. ÐÑа конÑÑанÑа опÑеделÑеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии (и ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ менÑÑÑ Ð² оÑобÑÑ ÑлÑÑаÑÑ ), а кÑоме Ñого, макÑималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑвелиÑена в ÑледÑÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ . Тип "char" (обÑаÑиÑе внимание на кавÑÑки) оÑлиÑаеÑÑÑ Ð¾Ñ char(1) Ñем, ÑÑо он ÑакÑиÑеÑки Ñ ÑаниÑÑÑ Ð² одном байÑе. Ðн иÑполÑзÑеÑÑÑ Ð²Ð¾ внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑиÑÑемнÑÑ ÑаблиÑÐ°Ñ Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ Ð¿ÐµÑеÑиÑлений.
| ÐÑед. | ÐаÑало | След. |
| ÐенежнÑе ÑÐ¸Ð¿Ñ | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | ÐвоиÑнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ |