Unsigned sql: types — What does `unsigned` in MySQL mean and when to use it?

Типы данных, используемые в базе данных MySQL — Справочник Web-языков

Материал из Справочник Web-языков

Перейти к: навигация, поиск

Содержание

  • 1 Целые числа
  • 2 Дробные числа
  • 3 Строки
  • 4 Бинарные данные
  • 5 Дата и время

Целые числа

Общий вид указания типа данных:

префиксINT [UNSIGNED]

Необязательный флаг UNSIGNED задает, что будет создано поле для хранения без знаковых чисел (больших или равных 0).

TINYINTМожет хранить числа от -128 до 127
SMALLINTДиапазон от -32 768 до 32 767
MEDIUMINTДиапазон от -8 388 608 до 8 388 607
INTДиапазон от -2 147 483 648 до 2 147 483 647
BIGINTДиапазон от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

Дробные числа

Точно так же, как целые числа подразделяются в MySQL на несколько разновидностей, MySQL поддерживает и несколько типов дробных чисел.

В общем виде они записываются так:

ИмяТипа[(length, decimals)] [UNSIGNED]

Здесь length — количество знакомест (ширина поля), в которых будет размещено дробное число при его передаче.

decimals — количество знаков после десятичной точки, которые будут учитываться.

UNSIGNED
— задает беззнаковые числа.
FLOAT
Число с плавающей точкой небольшой точности.
DOUBLE
Число с плавающей точкой двойной точности.
REAL
Синоним для DOUBLE.
DECIMAL
Дробное число, хранящееся в виде строки.
NUMERIC
Синоним для DECIMAL.

Строки

Строки представляют собой массивы символов. Обычно при поиске по текстовым полям по запросу SELECT не берется в рассмотрение регистр символов, т.е. строки «Вася» и «ВАСЯ» считаются одинаковыми. Кроме того, если база данных настроена на автоматическую перекодировку текста при его помещении и извлечении, эти поля будут храниться в указанной вами кодировке.

Для начала ознакомимся с типом строки, которая может хранить не более length символов, где length принадлежит диапазону от 1 до 255.

VARCHAR (length) [BINARY]

При занесении некоторого значения в поле такого типа из него автоматически вырезаются концевые пробелы. Если указан флаг BINARY, то при запросе SELECT строка будет сравниваться с учетом регистра.

VARCHARМожет хранить не более 255 символов.
TINYTEXTМожет хранить не более 255 символов.
TEXTМожет хранить не более 65 535 символов.
MEDIUMTEXTМожет хранить не более 16 777 215 символов.
LONGTEXTМожет хранить не более 4 294 967 295 символов.

Чаще всего применяется тип TEXT, но если вы не уверены, что данные не будут превышать 65 536 символов, используйте LONGTEXT.

Бинарные данные

Бинарные данные — это почти то же самое, что и данные в формате TEXT, но только при поиске в них учитывается регистр символов.

TINYBLOBМожет хранить не более 255 символов.
BLOBМожет хранить не более 65 535 символов.
MEDIUMBLOBМожет хранить не более 16 777 215 символов.
LONGBLOBМожет хранить не более 4 294 967 295 символов.

BLOD-данные не перекодируются автоматически, если при работе с установленным соединением включена возможность перекодирования текста «на лету».

Дата и время

MySQL поддерживает несколько типов полей, специально приспособленных для хранения дат и времени в различных форматах.

DATEДата в формате ГГГГ-ММ-ДД
TIMEВремя в формате ЧЧ:ММ:СС
DATETIMEДата и время в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
TIMESTAMPДата и время в формате timestamp. Однако при получении значения поля оно отображается не в формате timestamp, а в виде ГГГГММДДЧЧММСС, что сильно умаляет преимущества его использования в PHP

Когда следует использовать UNSIGNED и SIGNED INT в MySQL?

спросил

Изменено
5 месяцев назад

Просмотрено
142к раз

Когда следует использовать UNSIGNED и SIGNED INT в MySQL?
Что лучше использовать или это личное предпочтение?
Потому что я видел, как это использовалось вот так;

 id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
 

и

 id INT(11) NOT NULL AUTO_INCREMENT
 

2

UNSIGNED хранит только положительные числа (или ноль). С другой стороны, signed может хранить отрицательные числа (т.е. может иметь отрицательный знак ).

Вот таблица диапазонов значений, которые может хранить каждый тип INTEGER :

Источник: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html

UNSIGNED находится в диапазоне от 0 до n , а со знаком находится в диапазоне от -n/2 до n/2 .

В этом случае у вас есть столбец идентификатора AUTO_INCREMENT , поэтому у вас не будет отрицательных значений. Таким образом, используйте UNSIGNED . Если вы не используете UNSIGNED для столбца AUTO_INCREMENT , ваше максимально возможное значение будет вдвое меньше (и отрицательная половина диапазона значений останется неиспользованной).

2

Используйте UNSIGNED для неотрицательных целых чисел.

По сути, с UNSIGNED вы даете себе вдвое больше места для целого числа, поскольку вы явно указываете, что вам не нужны отрицательные числа (обычно потому, что значения, которые вы храните, никогда не будут отрицательными).

Для отрицательного целого числа используется SIGNED , а для неотрицательного целого числа используется UNSIGNED . Всегда предлагалось использовать UNSIGNED для идентификатора в качестве ПЕРВИЧНОГО КЛЮЧА.

Я думаю, что UNSIGNED будет лучшим вариантом для хранения чего-то вроде time_duration (например: разрешенное_время_звонка = разрешенное_время (DateTime)-creation_time (DateTime) ) значение в формате минут, часов или секунд, которое определенно будет неотрицательное число

Я не согласен с vipin cp .

Верно то, что первый бит используется для представления знака. Но 1 для отрицательного и 0 для положительных значений. Более того, отрицательные значения кодируются по-другому (дополнением до двух). Пример с TINYINT:

 Знаковый бит
|
1000 0000b = -128d
...
1111 1101b = -3d
1111 1110b = -2d
1111 1111b = -1d
0000 0000б = 0д
0000 0001б = 1д
0000 0010б = 2д
...
0111 1111б = 127д
 

Одна вещь, которую я хотел бы добавить
В подписанном int , который является значением по умолчанию в mysql , 1 бит будет использоваться для представления знака . -1 для отрицательного и 0 для положительного.
Поэтому, если ваше приложение вставляет только положительное значение, лучше указать без знака.

Если вы знаете тип номеров, которые собираетесь хранить, вы можете выбрать соответствующий.
В этом случае у вас есть «id», который никогда не может быть отрицательным. Таким образом, вы можете использовать unsigned int.
Диапазон целых чисел со знаком: от -n/2 до +n/2
Диапазон беззнакового целого: от 0 до n
Таким образом, у вас в два раза больше положительных чисел.
Выберите соответственно.

Если вы хотите, чтобы это было просто, вам нужно помнить, хотите ли вы также выполнять вычисления с этими числами (вычитание). Если вы, например, посчитаете A — B, а B больше, чем A, у вас могут возникнуть проблемы. Там вам нужно будет ПРИВЕСТИ ПОДПИСАННЫЙ номер к НЕПОДПИСАННОМУ.

Подробнее об этом можно прочитать, например, здесь:
BIGINT UNSIGNED VALUE IS вне диапазона My SQL

Используйте unsigned , если вам не нужно использовать чужое это поле в текущей таблице.
У меня была следующая проблема:

 Общая ошибка: 3780 Ссылочный столбец «event_id» и ссылочный столбец «id» в ограничении внешнего ключа «events_event_id_foreign» несовместимы. (SQL: изменить таблицу `events` добавить ограничение `events_event_id_foreign` внешний ключ (`event_id`) ссылается на `users` (`id`) при удалении каскада)
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Почему SQL Server не поддерживает неподписанный тип данных?

спросил

Изменено
4 месяца назад

Просмотрено
94k раз

Я специально думаю о unsigned int .

Вот практический пример: что вы делаете, когда ваша колонка идентификаторов достигает максимума? Можно либо пойти BigInt (хранение 8 байт вместо 4) или провести рефакторинг приложения для поддержки отрицательных целых чисел и даже создать свои собственные правила, как указано в этом ответе; ни один из этих вариантов не является оптимальным.

UInt было бы идеальным решением, но SQL Server не предлагает его (в отличие от MySQL).

Я понимаю, что неподписанные типы данных не являются частью стандарта SQL (SQL-2003), но все же мне это кажется пустой тратой времени.

По какой причине они не включены (в SQL Server или в стандарт)?

  • sql
  • sql-сервер
  • sqldatatypes
  • целое число без знака

14

Для этой цели вы можете использовать -2 147 483 648 в качестве начального значения.

 Личность(-2147483648, 1)
 

2

Если бы мне пришлось угадывать, я бы сказал, что они пытаются избежать распространения типов. Вообще говоря, нет ничего, что может сделать беззнаковое целое, чего не может сделать целое со знаком. Что касается случая, когда вам нужен номер между 2147483648 и 4294967296 вам, вероятно, следует перейти к 8-байтовому целому числу, поскольку число также в конечном итоге превысит 4294967296.

4

Я нашел аналогичный вопрос в Microsoft Office Dev Center.

В ответе Джима Хогга (руководителя программы) есть некоторые плюсы и минусы добавления целых чисел без знака. Главный недостаток заключается в том, что правила для реализации неявных преобразований типов становятся кошмаром для правильного понимания.

Запрос закрыт как «Не исправим».

3

Они не поддерживают ключевые слова SIGNED и UNSIGNED, поскольку они не являются стандартными. В стандарте SQL все числовые типы имеют знак.

UNSIGNED (и SIGNED, значение по умолчанию) — это расширения MySQL, которые могут быть полезны для хранения более высоких беззнаковых чисел в том же количестве байтов и запрещения отрицательных чисел.

2

Всегда можно использовать ДЕСЯТИЧНОЕ . Огромный десятичный — DECIMAL(38, 0) . Должно хватить на месяц или два…

 CREATE TABLE IdentityTest
(
    ID ДЕСЯТИЧНЫЙ (38, 0) ИДЕНТИЧНОСТЬ,
    Имя NVARCHAR(200)
)
ВСТАВИТЬ В IdentityTest VALUES('Джон'),('Питер'),('Том')
ВЫБЕРИТЕ * ИЗ IdentityTest
УДАЛИТЬ ТАБЛИЦУ IdentityTest
 

Что дает этот результат:

931-1.
Для записи присвоенного значения требуется 31 бит, и только 1 бит для записи знака значения.

Итак, ответ на ваш вопрос: «Ненужно». Несмотря на то, что каждое назначенное вами значение является положительным, оно тратит только 1 бит на значение. Создание нового типа данных для сохранения только 1 бита на значение — не лучший способ оптимизировать пространство для хранения.

1

Установите для вашей БД минимальную идентификацию
Identity(-2147483648, 1)

Затем при загрузке в переменную .net UInt64 добавьте к ней 2147483648. затем
-2147483648 становится 0
-1000000000 становится 1147483648

  • Но также в большинстве случаев внутренние ключи не должны открываться клиентам, я обычно использую отдельный ключ, который может быть чем-то вроде «ABCKey1»

Однако я согласен с тем, что тип данных достаточно велик в 99% систем. Если вам действительно нужно больше, вы можете использовать GUID, однако это отстой для индекса, если вы не используете следующий последовательный GUID.

Imacros | Все права защищены © 2021
Идентификатор Имя
1 Джон
2