我创建了一个表table1,其中一个列column1声明为VARCHAR(100) -
CREATE TABLE table1 (
-> column1 VARCHAR(100)
-> );DESCRIBE table1;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| column1 | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+现在,我从table1创建了另一个表column2,其中创建了一个单一列column2,并通过将table1中的column1转换为CHAR(100)来声明它-
CREATE TABLE table2 AS
-> SELECT CAST(column1 AS CHAR(100)) AS column2
-> FROM table1;DESCRIBE table2;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| column2 | varchar(100) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+在这里,非常奇怪的是,即使在将VARCHAR(100)转换为CHAR(100)之后,声明仍然保持为VARCHAR(100)
现在,我想确保创建一个包含通过强制转换声明的列的新表确实有效。所以我试着把FLOAT传给DECIMAL,如下所示-
CREATE TABLE table3 (
-> column3 FLOAT
-> );DESCRIBE table3;
+---------+-------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------+------+-----+---------+-------+
| column3 | float | YES | | NULL | |
+---------+-------+------+-----+---------+-------+CREATE TABLE table4 AS
-> SELECT CAST(column3 AS DECIMAL) AS column4
-> FROM table3;DESCRIBE table4;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| column4 | decimal(10,0) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+在这里,FLOAT被正确地抛给了DECIMAL。所以为什么我不能把VARCHAR投给CHAR。另外,如果将VARCHAR转换为CHAR不起作用,为什么我没有收到任何错误?
发布于 2021-08-28 14:50:33
在这里,非常奇怪的是,即使将VARCHAR(100)转换为CHAR(100),声明仍然保持为VARCHAR(100)
这不是什么奇怪的行为。很明显是记录在案
生成具有VARCHAR数据类型的字符串。除了表达式expr为空(零长度)外,结果类型为CHAR(0)。
我是第一个承认这是违反直觉的,但这是MySQL的工作方式。如果您想要一个char(),那么要么创建带有该类型的表并将其插入其中,要么在之后修改它。
https://stackoverflow.com/questions/68965069
复制相似问题