mysql varchar char text
建表时IP字段设成了varchar,但是由于要对其建索引,以达到与其它表结合查询时提高效率的目的,打算将它改成char,修改后竟然没有成功。
最后发现原来要改就必须把该表中的所有varchar和text的字段一次性都改为char:
alter table ip_table modify ipddress char(16) default '',modify status char(10) default '',modify memo char(255) default '';
又试了下,如果原表中都是char,只要把其中一个字段改为varchar或者text,则其它所有char字段自动改为varchar
……
alter table ip_table modify memo text;
之后表中的情况:
ipddress varchar(16)
status varchar(10)
memo text
mysql也太扯了……
到网上找了找,找到这样一个解释:
http://topic.csdn.net/t/20031117/21/2466393.html
在同一个表中不能混用CHAR 和VA R C H A R。MySQL 根据情况甚至会将列从一种类型转换为另一种类型。这样做的原因如下:
■ 行定长的表比行可变长的表容易处理(其理由请参阅2 . 3节“选择列的类型”)。
■ 表行只在表中所有行为定长类型时是定长的。即使表中只有一列是可变长的,该表的
行也是可变长的。
■ 因为在行可变长时定长行的性能优点完全失去。所以为了节省存储空间,在这种情况
下最好也将定长列转换为可变长列。
这表示,如果表中有VARCHAR 列,那么表中不可能同时有CHAR 列;MySQL 会自动
地将它们转换为VARCHAR 列。例如创建如下一个表:
CREATE TABLE my_table
(
c1 CHAR(10),
c2 VARCHAR(10)
)
如果使用DESCRIBE my_table 查询,则其输出如下:
Feild Type Null Key Default Extra
c1 varchar(10) yes null
c2 varchar(10) yes null
请注意,VARCHAR 列的出现使MySQL 将c1 也转换成了VARCHAR 类型。如果试图用
A LTER TABLE 将c1 转换为C H A R,将不起作用。将VARCHAR 列转换为CHAR 的惟一办
法是同时转换表中所有VARCHAR 列:
ALTER TABLE my_table MODIFY c1 CHAR(10),MODIFY c2 CHAR(10)