我最近在本地计算机上安装了 mariadb-10.6.17-winx64,并且在表列定义为 VARCHAR 且具有 DEFAULT NULL 设置时遇到了意外行为。尽管将该列指定为 DEAFAULT NULL,但它的行为似乎与文本 NULL 相同。在执行 IS NULL 查询时,此问题很明显,该查询意外地不返回这些列的结果。
笔记本文件编码:utf-8-BOM
当我运行以下查询时,根据以下查询检测到 vchar_null 列是否为非空值:(较旧的 mariadb 版本处理得很好):
SELECT
`c`.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,
`c`.`TABLE_NAME` AS `table_name`,
`c`.`COLUMN_NAME` AS `column_name`,
`c`.`IS_NULLABLE` AS `isnullable`,
c.DATA_TYPE,
COALESCE(`c`.`COLUMN_DEFAULT`, '') AS `default_value`,
(c.COLUMN_DEFAULT IS NULL) AS isnullll,
(CASE WHEN (`c`.`COLUMN_KEY` = 'PRI') THEN 1 ELSE 0 END) AS `primary_key`
FROM `information_schema`.`COLUMNS` `c`
WHERE (`c`.`TABLE_SCHEMA` = DATABASE()) AND c.TABLE_NAME = 'testnull4'
ORDER BY `c`.`TABLE_NAME`, `c`.`ORDINAL_POSITION`;
CREATE TABLE egisintra.testnull4 (
test_id int(11) NOT NULL AUTO_INCREMENT,
vchar_null varchar(255) DEFAULT NULL,
PRIMARY KEY (test_id)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_hungarian_ci;
(c.COLUMN_DEFAULT IS NULL) AS isnullll 列的结果是:0 而不是 1,这就是问题所在。
information_schema 的内容并不总是显而易见的。如果你想查看你的表结构,你应该这样做
show create table testnull4
在本例中,默认值列是一个 string,它显示默认值,就像在创建或更改表中显示的那样。如果为空,则为
NULL
。如果是字符串'NULL'
,那就是'NULL'
。如果它是一个表达式,您将看到该表达式。
默认值不能只是一个带有默认实际值的字符串(例如NULL或'NULL');那么就无法显示 CURRENT_TIMESTAMP 或表达式的默认值。