2014-10-25 4 views
0

Char и varchar - это типы данных в SQL, так как они находятся на многих других языках (поэтому этот вопрос может быть многоязычным).Почему я должен использовать char вместо varchar?

Из чего я понимаю, разница в том, что если я объявил Char как Char(20), он выделил бы 20 (байт/бит) [Может ли кто-нибудь прояснить этот бит тоже? На данный момент я буду использовать байты.]. Тогда, если бы я использовал только 16 байт, у меня все равно было бы четыре выделенных для этого поля. (Отходы 4 байта памяти.)

Однако, если я объявил varchar как varchar(20) и использовал только 16 байт, он выделил бы только 16 байт.

Неужели это лучше? Зачем кому-то выбирать char? Это враждебные причины, или что-то мне не хватает?

+1

Черт, я этого не видел. Интересно, почему он не появился, когда я спрашивал. По крайней мере, у меня есть ответ, спасибо! – KidCode

+0

Чтобы ответить на ваш другой вопрос, 'Char (20)' выделит достаточно места для 20 символов. Сколько места зависит от вашей используемой кодировки, но обычный английский текст ('latin1' - это пример в документах) требует только 1 байт на символ. Таким образом, это будет 20 байтов в кодировке latin1, но может быть больше, если вы используете неанглийский язык. –

+0

Для ** SQL Server **: 'varchar (n)' всегда несет как минимум 2 байта служебных данных, поэтому 'varchar (2)' не использует 0-2 байта, а 2-4 байта, а 'char (2) ** ** ** ** использует всего 2 байта (например, для двухкодовых кодов стран). Поэтому, если вы храните 16 символов текста в столбце 'varchar (20)', он использует 18 байт памяти –

ответ

6

Предпочитаю VARCHAR.

В старые времена плотного хранения это имело значение для космоса. В настоящее время дисковое хранилище дешево, но RAM и IO по-прежнему ценны. VARCHAR - это IO и кэширование; это позволяет вам более плотно упаковывать буферный буфер db с данными, а не в пустое пространство буквенного пространства, и по той же причине пространственное добавление накладывает накладные расходы ввода-вывода.

Восходящий путь к CHAR() используется для сокращения цепочки цепочек на часто обновляемых записях. Когда вы обновляете поле, и значение больше, чем было ранее выделено, запись может быть цепочкой. Это управляемо, однако; базы данных часто поддерживают параметр «процент бесплатно» на атрибутах табличного хранилища, который сообщает БД, сколько дополнительного места для предварительной распределения для каждой строки для роста.

VARCHAR почти всегда предпочтительнее, потому что пробел требует, чтобы вы знали об этом и кодировали по-разному. Различные базы данных обрабатывают его по-разному. С VARCHAR вы знаете, что ваше поле содержит только то, что вы храните в нем.

Я еще не разработал схему в течение более десяти лет с помощью CHAR.

+1

Хранение дешево, но кого это волнует? Речь идет не о том, чтобы тратить дисковое пространство. Речь идет о тратах ввода-вывода и драгоценного пространства в памяти. (Память, а также дешевая, часто гораздо сложнее расширять после факта, чем место для хранения.) –

+0

Я сказал: «Это уже не причина», это было упомянуто для исторических средств. Хотя я должен был упомянуть о оптимальных характеристиках буфера/IO varchar, а также проскользнул из виду. – codenheim

+0

Вы по-прежнему сосредоточены на хранении сегодня: «В наше время хранение дешево». Это обычная пословица, которая исправляет. –

0

ОТ Specification

символ [(N)]

фиксированной длины не-Unicode символьных данных с длиной п байт. n должно быть значением от 1 до 8000. Размер хранилища равен n байтам. Синтаксис символа SQL-92 - символ.

Таким образом, Char(20) выделит фиксированное 20 байтов пространства для хранения данных.

Использование:

Например, если у вас есть столбец с именем Gender, и вы хотите, чтобы присвоить значения, как только M для мужчин (OR) F женщина, и вы убедитесь, что поле/колонки не являются нулевой столбец , В таком случае, это гораздо лучше, чтобы определить его как CHAR(1) вместо как

Gender CHAR(1) not null 

Кроме того, varchar типы несет дополнительные накладные расходы на 2 bytes, как указано в документе. Размер хранилища - это фактическая длина введенных данных + 2 байта.

В случае char это не тот случай.

+0

Downvoter: не забудьте оставить комментарий вместе с downvote? – Rahul

+0

Не я, но если бы мне пришлось это догадаться, потому что вы только срывали документацию и не рассматривали основной вопрос - вы сказали, что для пола «намного лучше» определить его как «CHAR (1)», но haven Не надо было объяснять, почему. –

+0

Ahh! Да, но я как-то объяснил, приводя пример. В этом примере, что я имею в виду, когда вы знаете о размере в начале и размер будет исправлен, используйте 'char' – Rahul

Смежные вопросы