|
|
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
Добрый день, Разрабатываю архитектуру программы для управления некоторым типом документов. Документы могут иметь длинные строковые свойства. Возможно подключение разных СУБД через ODBC драйвер. Возник вопрос как хранить строки. Например в SQLite или MySQL указываю тип VarChar[255]. При этом для поля не резервируюются все 255 символов, а используется столько сколько занимает текст поля. С точки зрения размера базы - очень экономно. Подскажите пожелайста как обстоят дела с резервированием текстовых полей в других СУБД: - MS SQL - Oracle - PostgreSQL - FireBird Буду очень признателен за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2006, 21:13 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
MS SQL 2000 varchar[(n)] Variable-length non-Unicode character data with length of n bytes. n must be a value from 1 through 8,000. Storage size is the actual length in bytes of the data entered, not n bytes. The data entered can be 0 characters in length. The SQL-92 synonyms for varchar are char varying or character varying. nvarchar(n) Variable-length Unicode character data of n characters. n must be a value from 1 through 4,000. Storage size, in bytes, is two times the number of characters entered. The data entered can be 0 characters in length. The SQL-92 synonyms for nvarchar are national char varying and national character varying. text Variable-length non-Unicode data in the code page of the server and with a maximum length of 231-1 (2,147,483,647) characters. When the server code page uses double-byte characters, the storage is still 2,147,483,647 bytes. Depending on the character string, the storage size may be less than 2,147,483,647 bytes. ntext Variable-length Unicode data with a maximum length of 230 - 1 (1,073,741,823) characters. Storage size, in bytes, is two times the number of characters entered. The SQL-92 synonym for ntext is national text. Как правило - глупо экономить на спичках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2006, 23:13 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
О, простите. Не внимательно прочитал вопрос. В МS SQL для varchar отводится столько места, сколько он занял при первом инсерте. Если в процессе изменений длина увеличивается (но до указанного в определении поля предела), то сначала это увеличение делается за счет зарезервированного на странице места, а когда места не остается - страница расщепляется. Если фактическая длина уменшается - никаких "сжатий" страниц не делается. Вроде так было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2006, 23:38 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
PostgreSQL: Все строчные типы данные - char,varchar,text - внутри представлены одним типом данных. Места занимают сколько есть + 4 байта, но тип char добивается пробелами до полной длины. Максимальная длина строки - 1Гб. Если текст не влазит на страницу (8К), то он выносится в отдельную таблицу - т.н. TOAST - которая автоматически создается параллельно основной таблице. Там данные хранятся блоками по 2К. Текст длиной более некоторого предела PostgreSQL пытается сжать (lz-compression). Сжатие и/или хранение вне основной страницы можно отключить для любого столбца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 07:32 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
Спасибо за информацию. Еще хотелось бы узнать про FireBird и Oracle. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:12 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
В Oracle аналогично. Тип VARCHAR2 хранит столько символов, сколько было введено, CHAR - дополняется пробелами до указанной при объявлении длины ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:17 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
Oracle: Соответствующий тип данных называется varchar2, сохраняется только значимая информация + длина строки. Если строка null, то место под ее хранение не выделяется. Если строка превышает размер блока данных, то строка разбивается на фрагменты (chunk) и хранится в нескольких блоках в виде списка. При уменьшении длины строки освободившееся место при определенных условиях может быть использовано для хранения других строк. В данном перле под словом "строка" в подразумевается значение типа varchar2, не путать со строкой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 11:19 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
Тогда еще ворпос. На сколько отличается скорость выборки полей VARCHAR по сравнению с фиксированными CHAR? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 17:56 |
|
||
|
Хранение VarChar в различных СУБД
|
|||
|---|---|---|---|
|
#18+
Скажу применительно к Oracle. Нисколько. Строки таблицы размещены в блоках данных. При выборке строки весь блок целиком считывается в кэш (если его уже там нет). Если строка такая длинная, что не вмещается в блок, в этом случае приходится считывать доп. блоки, но это уже отдельная тема. В общем случае, как правило, используется тип VARCHAR2, тип CHAR, в основном, используется для хранения коротких фиксированных строк типа какого-либо признака ('Y' / 'N', 'Ж'/ 'М' и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 18:08 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34024832&tid=1545008]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 449ms |

| 0 / 0 |
