Comment déterminer si une colonne n’est pas signée ?
-
11-12-2019 - |
Question
J'essaie actuellement de lister toutes les colonnes d'une table spécifique et de déterminer si chaque colonne n'est pas signée ou non.
Ici, un exemple de mon montage de test :
CREATE TABLE ttypes
(
cbiginteger BIGINT UNSIGNED,
cinteger INT UNSIGNED,
csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;
Afin de lister toutes les colonnes d'un tableau spécifique, j'ai trouvé deux possibilités :
SHOW FULL COLUMNS
FROM ttypes;
Selon le Documentation, cette requête renvoie ces champs :Champ, Type, Null, Par défaut, Extra et Commentaire.Aucun d'entre eux ne me permet de déterminer si une colonne n'est pas signée ou non.
Après cela, je regarde le information_schema.columns
qui est la table de base utilisée par le SHOW COLUMNS
requête.
SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';
Malheureusement, aucun des champs de résultat ne me permet de déterminer si une colonne n'est pas signée ou non.
La solution
Pour autant que je sache, le seul endroit où ces attributs sont stockés est dans COLUMN_TYPE
dans INFORMATION_SCHEMA.COLUMNS
.
Cela devrait être inclus dans la sortie de SHOW COLUMNS
(dans 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)
Malheureusement, vous devrez analyser le contenu de Type
et trouve unsigned
, ou non unsigned
là-dedans - il ne met rien pour les colonnes signées.
Autres conseils
Essayez cette magie :
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'
Sortir
COLUMN_NAME COLUMN_TYPE IS_NULLABLE IS_UNSIGNED
----------- ---------------- ----------- -----------
id int(10) unsigned NO YES
recordID varchar(255) YES NO
Pour déterminer le type de toutes les variables d'une table, vous pouvez exécuter une requête comme celle-ci :
select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%'
Après cela, vous pouvez facilement déterminer le type d'une variable spécifique (par exemple le cinterger) avec une requête comme celle-ci :
select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='ttypes' and COLUMN_TYPE LIKE '%unsigned%' and COLUMN_NAME LIKE 'cinteger'
Le code ci-dessus renverra le nom de la variable recherchée uniquement si elle n'est pas signée.
Enfin, vous pouvez utiliser une boucle MySQL, une procédure ou votre langage de script préféré pour utiliser ce résultat et/ou continuer à rechercher d'autres variables.
Juste au cas où quelqu'un tomberait sur cela pour le pilote MySQL dans .net, en utilisant GetSchema() comme moi, voici comment les informations non signées sont disponibles.
_connection.GetSchema("Columns")
Et puis:
J'espère que cela n'est pas complètement hors de propos pour la question et aide quelqu'un qui cherche à déterminer le signe par programme.