Unsigned sql: types — What does `unsigned` in MySQL mean and when to use it?
Содержание
Типы данных, используемые в базе данных MySQL — Справочник Web-языков
Материал из Справочник Web-языков
Перейти к: навигация, поиск
Содержание
|
Целые числа
Общий вид указания типа данных:
префикс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
Что дает этот результат:
Идентификатор | Имя |
---|---|
1 | Джон |
2 |