在 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 并插入其中,要么随后更改它。
我创建了一个 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 并插入其中,要么随后更改它。