Подтвердить что ты не робот

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

В настоящее время я пытаюсь перечислить все столбцы конкретной таблицы и определить, нет ли каждого столбца без знака.

Вот пример моего теста:

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';

К сожалению, ни одно из полей результатов не позволяет определить, нет ли столбца без знака.

4b9b3361

Ответ 1

Насколько я могу судить, единственное место, где хранятся эти атрибуты, находится в 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 там - он не помещает ничего для подписанных столбцов.

Ответ 2

Чтобы определить тип для всех переменных в таблице, вы можете запустить такой запрос:

select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' 

После этого вы можете легко определить тип для определенной переменной (например, cinterger) с таким запросом:

select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'

Приведенный выше код вернет имя переменной, которую вы искали, только если она не указана.

Наконец, вы можете использовать цикл mysql, процедуру или ваш любимый язык сценариев для использования этого результата и/или продолжить поиск других переменных.

Ответ 3

Попробуйте эту магию:

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