Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 varchar(255)  [new]
InterSky
Member

Откуда:
Сообщений: 575
Почему в 99% примеров varchar поле делают длинной 255, а не 256? Ведь не может быть текстового поля длинной 0 (ноль), значить считать должно от 1 (единицы). Иначе тогда при желании расзместить около 1000 символов должны были бы давать размер 1023, но в большинсве примеров varchar(1024). Почему такое разное отношение?
7 мар 13, 00:47    [14022755]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
В старых версиях MySQL максимальная длина VARCHAR была 255. Так что указывать 255 "более совместимо".
7 мар 13, 01:06    [14022797]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
InterSky
Member

Откуда:
Сообщений: 575
А в современных, имеет ли для базы какое-то различие делаю я varchar(255) или varchar(255), и по аналогии есть ли для самой базы разница varchar(1023) или varchar(1024). Просто обычно информация берётся пакетами кратными 8. Наверно использование какого-то из этих вариантов должно дать дополнительную скорость именно на уровне работы с жёстким диском...
Или не заморачиваться и писать varchar(1000)?
7 мар 13, 21:09    [14026119]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21494
Не 1000, и не 1023, и не 1024. А столько, сколько реально необходимо. Сколько реально хватит на любое максимально длинное в данном поле содержимое.
7 мар 13, 22:52    [14026468]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
InterSky
А в современных, имеет ли для базы какое-то различие делаю я varchar(255) или varchar(255)
Разница есть, но мизерная - в размере счетчика символов (один байт или два).
7 мар 13, 23:21    [14026586]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
InterSky
Member

Откуда:
Сообщений: 575
Akina
Не 1000, и не 1023, и не 1024. А столько, сколько реально необходимо. Сколько реально хватит на любое максимально длинное в данном поле содержимое.

А ты всегда точно знаешь "сколько необходимо"?
Какова должна быть длинна поля "Имя"?
10 символов?
Или может 20?
А может с запасом взять 100?
А со мной в универе жил индус, его имя в паспорте занимало 4 строки (гораздо больше чем 100 символов).
По этому надо брать максимальное неменьшающее производительность. Вот и думаю - 255 или 256? Или для других случаев 1023 или 1024? Будет ли разница? Для языков программирования типа Delphi, когда длина строки больше 256, операции с ними замедляются почти в 4 раза. Но в Delphi обращение Name[1] выведет первый символ, а в РНР обращение к $Name[1] выведет второй символ (чтобы вывести первый надо обратиться к $Name[0]). Вот и пытаюсь понять - где у MySQL начинается второй байт строки, ведь нельзя объявить varchar(0).
8 мар 13, 00:17    [14026729]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
А также для сокращения потерь при выделении памяти под такие строки, т.к. в 32 разрядном MySQL, менеджер памяти выделяет блок памяти, выровненный по границе DWORD (4 байта), а в 64 разрядном - QWORD (8 байт). Таким образом, желательно, чтобы размеры элементов, под которые выделяются блоки памяти, были кратны выравниванию.
8 мар 13, 00:17    [14026732]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
InterSky
По этому надо брать максимальное неменьшающее производительность. Вот и думаю - 255 или 256? Или для других случаев 1023 или 1024? Будет ли разница? Для языков программирования типа Delphi, когда длина строки больше 256, операции с ними замедляются почти в 4 раза. Но в Delphi обращение Name[1] выведет первый символ, а в РНР обращение к $Name[1] выведет второй символ (чтобы вывести первый надо обратиться к $Name[0]).


Если мне не изменяет память, то в PHP ты можешь задать не размерность, а границы массива, сделав первым элементом не 0, а 1. Нет?


InterSky
Вот и пытаюсь понять - где у MySQL начинается второй байт строки, ведь нельзя объявить varchar(0).

RTFM?
http://dev.mysql.com/doc/refman/5.5/en/char.html
8 мар 13, 00:23    [14026743]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
InterSky
Member

Откуда:
Сообщений: 575
DBConstructor
Если мне не изменяет память, то в PHP ты можешь задать не размерность, а границы массива, сделав первым элементом не 0, а 1. Нет?

Мы говорим о массивах или о строках? Я ни разу не слышал чтобы можно было бы что-то изменить в настройках РНР чтобы обращение к первой букве строки происходило через скажем $Name[1] или substr($Name,1,1), в отличии от делфовских Name[1] или copy(Name,1,1) которые выдадут первый символ. Хотя на обоих языках работаю больше 13 лет.

DBConstructor
http://dev.mysql.com/doc/refman/5.5/en/char.html

И мы опять возвращаемся к первой строке моего вопроса: там как и в 99% других примерах говорится о varchar(255), тоесть байт-1. В то время когда приводятся примеры где надо около 1000 символов, практически никогда не встретишь varchar(1000) или varchar(1023), а используется varchar(1024), тоесть 4*байт, без всяких -1.
8 мар 13, 01:57    [14026937]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
InterSky
И мы опять возвращаемся к первой строке моего вопроса: там как и в 99% других примерах говорится о varchar(255), тоесть байт-1. В то время когда приводятся примеры где надо около 1000 символов, практически никогда не встретишь varchar(1000) или varchar(1023), а используется varchar(1024), тоесть 4*байт, без всяких -1.

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section E.10.4, “Table Column-Count and Row-Size Limits”.

In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.


Я ответил на вопрос "как?", а вопрос "почему в примерах пишут varchar(1024)?" лучше адресовать авторам этих примеров.
В подобных случаях, предпочту написать varchar(1022)
8 мар 13, 18:21    [14028021]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21494
InterSky
ты всегда точно знаешь "сколько необходимо"?
Какова должна быть длинна поля "Имя"?

ЕМНИП самое длинное имя в мире содержит 1478 букв... так что varchar(255) мало, а любая длина от 1478*3=4434 до 65535 подойдёт. Если задаться целью по максимуму сэкономить байты, и при этом не бояться граблей - будет varchar(9999).
8 мар 13, 21:48    [14028408]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
InterSky
Member

Откуда:
Сообщений: 575
Akina
InterSky
ты всегда точно знаешь "сколько необходимо"?
Какова должна быть длинна поля "Имя"?

ЕМНИП самое длинное имя в мире содержит 1478 букв... так что varchar(255) мало, а любая длина от 1478*3=4434 до 65535 подойдёт. Если задаться целью по максимуму сэкономить байты, и при этом не бояться граблей - будет varchar(9999).

Ты хотел сказать - В таком-то году самое длинное имя содержало 1478 букв.
А сколько новорождённых с тех пор получили более длинные имена - ты не знаешь.
Да и имевший то (самое длинное) имя, мог вчера прийти в паспортный стол и добавить ещё две буквы к своему имени...
Вопрос ритарический, просто ты не всегда знаешь длинну поля.
Вчера парсил лог апача, и есть поле c названием домена. Точно знаю же что длина имени каждого домена (между разделительными точками) не может превышать 63 знака, а общая длина имени (включая имена субдоменов, разделительные точки и имя зоны) ограничена 255 знаками. А там бах, один домен - 267 символов...


DBConstructor,
А почему 1022? Ну я бы ещё понял 1023 (четыре байта минус один), но 1022 - это уже как varchar(254)
11 мар 13, 19:00    [14037076]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
InterSky
DBConstructor,
А почему 1022? Ну я бы ещё понял 1023 (четыре байта минус один), но 1022 - это уже как varchar(254)

потому, что читать документацию надо внимательней! :)
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.

Поэтому "255-1" и "1024-2" )))
14 мар 13, 17:20    [14048888]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
DBConstructor
Поэтому "255-1" и "1024-2" )))

Тьфу, опечатался!
Поэтому "256-1" и "1024-2"
14 мар 13, 17:21    [14048895]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
DBConstructor,

а 1024 откуда взялось?
14 мар 13, 17:26    [14048922]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
miksoft
DBConstructor,

а 1024 откуда взялось?

из сообщений выше
Число 1024 - это 210, кратное 2, 22, 24
Только не спрашивайте меня, зачем нужна кратность :) Всё написано выше.
14 мар 13, 17:55    [14049082]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
DBConstructor
miksoft
DBConstructor,

а 1024 откуда взялось?

из сообщений выше
Число 1024 - это 210, кратное 2, 22, 24
Только не спрашивайте меня, зачем нужна кратность :) Всё написано выше.
Я таки спрошу, почему нужна именно такая кратность? Почему не 29 или 211 ?
14 мар 13, 17:57    [14049090]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
miksoft
Почему не 29 или 211 ?
Почему же не? 512 и 2048 тоже кратные и 4-ем и 16-ти. В случае использования для varchar этих значений длин, я бы написал VARCHAR(510) и VARCHAR(2046)
А вот для значений 64 и 128 я бы написал VARCHAR(63) и VARCHAR(127)
14 мар 13, 18:35    [14049264]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
Я вообще не вижу смысла играться с этими круглостями/кратностями.
Все равно полный размер записи в итоге скорее всего выйдет не круглый/кратный. Тем более, что в большинстве таблиц, где хранятся строки, строки заполнены на разныю длину, т.е. и записи будут разной длины.

У нас в корпоративной БД чаще берутся значения из ряда 50/100/200/500. Просто потому, что их проще объяснить пользователям.
14 мар 13, 18:45    [14049303]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
miksoft
Я вообще не вижу смысла играться с этими круглостями/кратностями.
Все равно полный размер записи в итоге скорее всего выйдет не круглый/кратный. Тем более, что в большинстве таблиц, где хранятся строки, строки заполнены на разныю длину, т.е. и записи будут разной длины.

У нас в корпоративной БД чаще берутся значения из ряда 50/100/200/500. Просто потому, что их проще объяснить пользователям.

Выравнивание никак не влияет на хранящиеся на диске записи, а лишь на размещение и скорость работы в памяти. Когда считанная запись размещается в памяти, то память под нее выделяется с учетом полной длины, исходя из данных схемы.
14 мар 13, 18:55    [14049341]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
miksoft
Member

Откуда:
Сообщений: 38920
DBConstructor
Когда считанная запись размещается в памяти, то память под нее выделяется с учетом полной длины, исходя из данных схемы.
Откуда такая сильно сомнительная информация? Вы исходники MySQL смотрели? О каких именно структурах/буферах речь?

И даже если процитированное верно, то все равно нет смысла гонятся за выравниванием, ибо помимо пользовательских данных вместе с записями хранится еще куча вспомогательных, о которых нам ничего не известно.
14 мар 13, 19:27    [14049480]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
tanglir
Member

Откуда:
Сообщений: 28966
miksoft
DBConstructor
пропущено...

из сообщений выше
Число 1024 - это 210, кратное 2, 22, 24
Только не спрашивайте меня, зачем нужна кратность :) Всё написано выше.
Я таки спрошу, почему нужна именно такая кратность? Почему не 29 или 211 ?
+1
"256-1" - это понятно, если меньше, то длина умещается в 1 байт, если больше - то в 2. Но 2 байта позволяют хранить длину до 65536 (что, кстати, упомянуто и в мануале - "The length can be specified as a value from 0 to 65,535"), так что при чём тут 1024?
14 мар 13, 19:55    [14049602]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
tanglir
miksoft
пропущено...
Я таки спрошу, почему нужна именно такая кратность? Почему не 29 или 211 ?
+1
"256-1" - это понятно, если меньше, то длина умещается в 1 байт, если больше - то в 2. Но 2 байта позволяют хранить длину до 65536 (что, кстати, упомянуто и в мануале - "The length can be specified as a value from 0 to 65,535"), так что при чём тут 1024?

Кто-нибудь из вас удосужился прочесть ТС ? ;)
InterSky
Почему в 99% примеров varchar поле делают длинной 255, а не 256? Ведь не может быть текстового поля длинной 0 (ноль), значить считать должно от 1 (единицы). Иначе тогда при желании расзместить около 1000 символов должны были бы давать размер 1023, но в большинсве примеров varchar(1024). Почему такое разное отношение?
14 мар 13, 19:58    [14049606]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
tanglir
Member

Откуда:
Сообщений: 28966
InterSky
Ведь не может быть текстового поля длинной 0 (ноль)
мануал с этим не согласен :)

А вообще тут 14028021 я согласен со всем, кроме последней фразы насчёт 1022, т.к. применительно к варчару оно нисколько не магическое, в отличие от 255.
14 мар 13, 20:08    [14049620]     Ответить | Цитировать Сообщить модератору
 Re: varchar(255)  [new]
DBConstructor
Member [заблокирован]

Откуда: RU-SPE
Сообщений: 716
tanglir
А вообще тут 14028021 я согласен со всем, кроме последней фразы насчёт 1022, т.к. применительно к варчару оно нисколько не магическое, в отличие от 255.

хм... А в чем магия 255? отведенный размер памяти под VARCHAR(255) <= 256 байт, а под VARCHAR(1022) <= 1024 байта. Никакой магии...
14 мар 13, 20:15    [14049646]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / MySQL Ответить