Как определить, является ли столбец беззнаковым?
-
11-12-2019 - |
Вопрос
В настоящее время я пытаюсь перечислить все столбцы определенной таблицы и определить, является ли каждый столбец беззнаковым или нет.
Вот пример моего тестового приспособления:
CREATE TABLE ttypes
(
cbiginteger BIGINT UNSIGNED,
cinteger INT UNSIGNED,
csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;
Чтобы перечислить все столбцы конкретной таблицы, я нашел две возможности:
SHOW FULL COLUMNS
FROM ttypes;
Согласно документация, этот запрос возвращает следующие поля:Поле, Тип, Нуль, По умолчанию, Дополнительно и Комментарий.Ни один из них не позволяет мне определить, является ли столбец беззнаковым или нет.
После этого я смотрю на information_schema.columns
которая является базовой таблицей, используемой SHOW COLUMNS
запрос.
SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';
К сожалению, ни одно из полей результатов не позволяет мне определить, является ли столбец беззнаковым или нет.
Решение
Насколько я могу судить, единственное место, где хранятся эти атрибуты, — это COLUMN_TYPE
в INFORMATION_SCHEMA.COLUMNS
.
Это должно быть включено в выходные данные SHOW COLUMNS
(в пределах Type
):
mysql> show columns from ttypes;
+---------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+----------------------+------+-----+---------+-------+
| cbiginteger | bigint(20) unsigned | YES | | NULL | |
| cinteger | int(10) unsigned | YES | | NULL | |
| csmallinteger | smallint(5) unsigned | YES | | NULL | |
+---------------+----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
К сожалению, вам придется проанализировать содержимое Type
и найти unsigned
, или нет unsigned
там - он ничего не добавляет для подписанных столбцов.
Другие советы
попробуйте эту магию:
select COLUMN_NAME,
COLUMN_TYPE,
IS_NULLABLE,
IF(COLUMN_TYPE LIKE '%unsigned', 'YES', 'NO') as IS_UNSIGNED
from information_schema.COLUMNS where TABLE_NAME='record1'
.
Выход
COLUMN_NAME COLUMN_TYPE IS_NULLABLE IS_UNSIGNED
----------- ---------------- ----------- -----------
id int(10) unsigned NO YES
recordID varchar(255) YES NO
. Чтобы определить тип для всех переменных в таблице Вы можете запустить такое запрос:
select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%'
.
После этого вы можете легко определить тип для конкретной переменной (например, Сюжетное значение) с таким запросом:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'
.
Приведенный выше код вернет имя переменной, ищенной только в том случае, если оно без знака.
Наконец ваша можно использовать петлю MySQL, процедуру или ваш любимый язык сценариев для использования этого результата и / или продолжать поиск других переменных.