mysql 如何判断一个列是否是unsigned?

jm2pwxwz  于 2023-04-19  发布在  Mysql
关注(0)|答案(5)|浏览(180)

我目前正在尝试列出一个特定表的所有列,并确定每一列是否是无符号的。
下面是我的测试夹具的一个例子:

CREATE TABLE ttypes
(
    cbiginteger BIGINT UNSIGNED,
    cinteger INT UNSIGNED,
    csmallinteger SMALLINT UNSIGNED
) ENGINE = InnoDB;

为了列出特定表的所有列,我发现了两种可能性:

SHOW FULL COLUMNS
FROM ttypes;

根据documentation,此查询返回以下字段:字段、类型、空值、默认值、附加值和注解。它们都不允许我确定一个列是否是无符号的。
之后,我查看information_schema.columns,它是SHOW COLUMNS查询使用的基表。

SELECT ...
FROM information_schema.columns
WHERE table_name = 'ttypes';

不幸的是,没有一个结果字段允许我确定一个列是否是无符号的。

bybem2ql

bybem2ql1#

试试这个魔法:

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
vshtjzan

vshtjzan2#

据我所知,这些属性的唯一存储位置是INFORMATION_SCHEMA.COLUMNS中的COLUMN_TYPE
这应该包含在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-它没有为有符号列放入任何内容。

ercv8c1e

ercv8c1e3#

要确定表中所有变量的类型,可以运行如下查询:

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循环,过程或你最喜欢的脚本语言来使用这个结果和/或继续搜索其他变量。

6xfqseft

6xfqseft4#

为了防止有人在.net中偶然发现这个MySQL驱动程序,像我一样使用GetSchema(),这里是如何获得未签名信息的。

_connection.GetSchema("Columns")

然后:

希望这不是完全不合时宜的问题,并帮助有人寻找编程确定的迹象。

jm81lzqq

jm81lzqq5#

我使用SQLColumns通过ODBC获取类型名称。这适用于8.0.29之前的Connector/ODBC版本。从8.0.29开始,它不再包含“unsigned”,我再也不能以这种方式获取类型。

相关问题