Como determinar se uma coluna não está assinado?
-
11-12-2019 - |
Pergunta
Atualmente estou tentando lista de todas as colunas de uma tabela específica e determinar se cada coluna não for assinado ou não.
Aqui, um exemplo do meu teste de fixação:
CREATE TABLE ttypes
(
cbiginteger BIGINT UNSIGNED,
cinteger INT UNSIGNED,
csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;
Em ordem a lista de todas as colunas de uma tabela específica, encontrei duas possibilidades:
SHOW FULL COLUMNS
FROM ttypes;
De acordo com o documentação, esta consulta retorna estes campos:Campo Tipo Nulo Padrão, Extra Comentário.Nenhum deles me permite determinar se uma coluna não for assinado ou não.
Depois que eu olhar para o information_schema.columns
qual é a base da tabela utilizada pelo SHOW COLUMNS
consulta.
SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';
Infelizmente, nenhum dos campos de resultado me permite determinar se uma coluna não for assinado ou não.
Solução
Tanto quanto eu posso dizer, o único lugar que esses atributos são armazenados em COLUMN_TYPE
no INFORMATION_SCHEMA.COLUMNS
.
Que devem ser incluídos nos resultados do SHOW COLUMNS
(dentro de 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)
Infelizmente, você teria que analisar o conteúdo da Type
e encontrar unsigned
, ou não unsigned
ali não coloca qualquer coisa para assinou colunas.
Outras dicas
Tente esta magia:
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'
Saída
COLUMN_NAME COLUMN_TYPE IS_NULLABLE IS_UNSIGNED
----------- ---------------- ----------- -----------
id int(10) unsigned NO YES
recordID varchar(255) YES NO
Para determinar o tipo para todas as variáveis em uma tabela, você pode executar uma consulta como esta:
select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%'
Depois disso, pode facilmente determinar o tipo para uma variável específica (por exemplo, o cinterger) com uma consulta como esta:
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'
O código acima irá retornar o nome da variável pesquisada somente se ele não estiver assinado.
Por último, pode utilizar o mysql é um loop, procedimento ou o seu favorito linguagem de script para usar este resultado e/ou continuar a procurar outras variáveis.
Apenas no caso de alguém se depara com isso para o MySQL driver .net, usando GetSchema() gosta de mim, aqui é como não assinados informação está disponível.
_connection.GetSchema("Columns")
E em seguida:
Espero que isso não está completamente fora de lugar para a pergunta, e a ajuda de alguém olhando para determinar programaticamente o sinal.