Как определить, является ли столбец беззнаковым?

StackOverflow https://stackoverflow.com//questions/10664913

  •  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, процедуру или ваш любимый язык сценариев для использования этого результата и / или продолжать поиск других переменных.

На всякий случай, когда кто-то спотыкается на этом для драйвера MySQL в .NET, используя GetSchema (), как я, вот как информация без знака доступна.

_connection.GetSchema("Columns")
.

 Введите описание изображения здесь

а затем:

 Введите описание изображения здесь

Надеюсь, это не совсем не имеет место для вопроса и помогает кому-то искать программно определение знака.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top