在 MySQL 中使用 CAST() 将 VARCHAR 转换为 CHAR,但最终结果仍然是 VARCHAR 而不是 CHAR

In MySQL using CAST() to CAST VARCHAR to CHAR, but end result is still VARCHAR and not CHAR

我创建了一个 table table1,单列 column1 声明为 VARCHAR(100) -

CREATE TABLE table1 (
    -> column1 VARCHAR(100)
    -> );
DESCRIBE table1;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| column1 | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+

现在我从 table1 创建另一个 table table2,我在其中创建一个列 column2 并通过从 [=19 强制转换 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)

现在,我想确保创建一个新的 table 并通过强制转换声明的列确实有效。所以我尝试将 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 不起作用,为什么我没有收到任何错误?

Here, strangely enough, even after casting VARCHAR(100) AS CHAR(100), the declaration still remains as VARCHAR(100)

这不是奇怪的行为。明明是documented:

  • CHAR[(N)] [charset_info]

Produces a string with the VARCHAR data type. except that when the expression expr is empty (zero length), the result type is CHAR(0).

我是第一个承认这有点违反直觉的人,但这就是 MySQL 的工作原理。如果您想要一个 char(),那么要么创建具有该类型的 table 并插入其中,要么随后更改它。