在数据库管理,ALTER TABLE操作的一个至关重要的部分修改数据库结构。MySQL,流行的数据库管理系统,提供在线操作自5.6版本,提供一种方便的方法来执行这些改变没有锁定的表。然而,有些警告。在这个博客中,我们将探索在线改变VARCHAR列的过程,深入研究见解而扩大这些列的大小。
开始我们的旅程,让我们考虑一个表定义,需要一个名为“_varchar”的VARCHAR列的扩张来容纳更多的数据。这是原始表定义:
|
1
2
3
4
5
|
下降
表
如果存在
varchar_alter;
创建
表
“varchar_alter”(
“id”
INT
非空
AUTO_INCREMENT
主键,
“_varchar”
VARCHAR(50)
非空
)
引擎
=
InnoDB;
|
我们执行最初的ALTER TABLE命令:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql>
改变
表
test.varchar_alter
改变
列
_varchar_varchar
VARCHAR(85)
非空
默认的
”,
算法
=原地,
锁
=
没有一个;
查询好吧,0
行
影响(0.01sec)
记录:0副本:0
警告:0
mysql>
显示
创建
表
“varchar_alter石头
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:varchar_alter
创建
表:
创建
表
“varchar_alter”(
“id”
int
非空
AUTO_INCREMENT,
“_varchar”
varchar(85)
非空
默认的
”,
主键
(“id”)
)
引擎
=
InnoDB
默认的
字符集
=utf8mb3
1
行
在
集
(0.00sec)
|
出现变更成功,我们看到表定义相应的修改。
现在,让我们尝试后续变更——试图扩大到200人。令人惊讶的是,当我们试图提高VARCHAR列长度到200年,我们遇到一个错误:
|
1
2
|
mysql>
改变
表
test.varchar_alter
改变
列
_varchar_varchar
VARCHAR(200)
非空
默认的
”,
算法
=原地,
锁
=
没有一个;
错误1846年(0 a000):
算法
=原地
是
不
支持。原因:不能
改变
列
类型
原地。试一试
算法
=副本。
|
DDL否认,MySQL建议使用复制算法。命令与算法改变了去复制和共享锁如下,并成功执行改变VARCHAR列:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql
>
改变
表
测试
。
varchar_alter
改变
列
_varchar
_varchar
VARCHAR
(
200年
)
不
零
默认的
”
,
算法
=
复制
,
锁
=
共享
;
查询
好吧
,
0
行
影响
(
0.03
证券交易委员会
)
记录
:
0
重复的
:
0
警告
:
0
mysql
>
显示
创建
表
”
varchar_alter
”
G
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1。
行*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
表
:
varchar_alter
创建
表
:
创建
表
”
varchar_alter
”
(
”
id
”
int
不
零
AUTO_INCREMENT
,
”
_varchar
”
varchar
(
200年
)
不
零
默认的
”
,
主
关键
(
”
id
”
)
)
引擎
=
InnoDB
默认的
字符集
=
utf8mb3
1
行
在
集
(
0.00
证券交易委员会
)
|
理解就地改变的极限
为什么MySQL否认在线改变(算法=原地)修改VARCHAR列长度200虽然最初,它允许对提高这85 ?
我们得到答案从文档本身,这与VARCHAR如何存储数据,实际上前缀和数据。在MySQL中,VARCHAR值存储为一个或两字节长度的前缀+数据。前缀长度取决于大数据。数据长度最多255个字节,使用只有一个字节的前缀,但是值超过255字节,前缀长度要求是两个字节。因此就地ALTER TABLE只支持增加VARCHAR列大小从0到255字节或从256字节到更大的尺寸。它不允许原地改变时,改变需要扩展前缀长度。
看到这,你可以查询information_schema列的表。最初,列长度ALTER-ed到85的时候,注意下面的细节。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
|
mysql>
选择
*
从
information_schema。列
在哪里
TABLE_SCHEMA=
“测试”
和
TABLE_NAME
在
(“varchar_alter”)
和
COLUMN_NAME=
“_varchar”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
TABLE_CATALOG:def
TABLE_SCHEMA:测试
TABLE_NAME:varchar_alter
COLUMN_NAME:_varchar
ORDINAL_POSITION:2
COLUMN_DEFAULT:
IS_NULLABLE:
没有
DATA_TYPE:
varchar
<强大的>CHARACTER_MAXIMUM_LENGTH:85年
CHARACTER_OCTET_LENGTH:255年
</强>
NUMERIC_PRECISION:
零
NUMERIC_SCALE:
零
DATETIME_PRECISION:
零
CHARACTER_SET_NAME:utf8mb3
COLLATION_NAME:utf8mb3_general_ci
COLUMN_TYPE:
varchar(85)
COLUMN_KEY:
额外的:
特权:
选择,插入,更新,引用
COLUMN_COMMENT:
GENERATION_EXPRESSION:
SRS_ID:
零
1
行
在
集
(0.00sec)
|
这里,CHARACTER_MAXIMUM_LENGTH指定长度的字符存储在列,而CHARACTER_OCTET_LENGTH指定长度的字节。注意,对于这个专栏,字节长度已经255年,进一步增加需要MySQL扩展VARCHAR前缀大小两个字节。200年改变VARCHAR列大小之后,下面是存储需求。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
|
mysql>
选择
*
从
information_schema。列
在哪里
TABLE_SCHEMA=
“测试”
和
TABLE_NAME
在
(“varchar_alter”)
和
COLUMN_NAME=
“_varchar”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
TABLE_CATALOG:def
TABLE_SCHEMA:测试
TABLE_NAME:varchar_alter
COLUMN_NAME:_varchar
ORDINAL_POSITION:2
COLUMN_DEFAULT:
IS_NULLABLE:
没有
DATA_TYPE:
varchar
<强大的>CHARACTER_MAXIMUM_LENGTH:200年
CHARACTER_OCTET_LENGTH:600年
</强>
NUMERIC_PRECISION:
零
NUMERIC_SCALE:
零
DATETIME_PRECISION:
零
CHARACTER_SET_NAME:utf8mb3
COLLATION_NAME:utf8mb3_general_ci
COLUMN_TYPE:
varchar(200)
COLUMN_KEY:
额外的:
特权:
选择,插入,更新,引用
COLUMN_COMMENT:
GENERATION_EXPRESSION:
SRS_ID:
零
1
行
在
集
(0.00sec)
|
如何在线改变VARCHAR列在这种情况下吗
当面对在线ALTER TABLE VARCHAR列的限制在MySQL,考虑使用一个很好的替代品雷竞技下载官网Percona工具包pt-online-schema-change。众所周知,行业标准工具,Percona工具包的一部分,执行在线更改以最少的停机时间。雷竞技下载官网
ALTER TABLE改变VARCHAR列的字符集
还要记住的是,这也意味着改变列的字符集。当然,一个字符集定义了存储需求,和改变字符集也导致增加所需的字节数。因此你还需要考虑而做出改变。检查下面的示例,您可以看到存储85字节的VARCHAR长度,长度增加了340年而不是255年以前。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
31日
|
mysql>
改变
表
test.varchar_alter
改变
列
_varchar_varchar
VARCHAR(84)
字符集
UTF8MB4
非空
默认的
”,
算法
=原地,
锁
=
没有一个;
错误1846年(0 a000):
算法
=原地
是
不
支持。原因:不能
改变
列
类型
原地。试一试
算法
=副本。
mysql>
改变
表
test.varchar_alter
改变
列
_varchar_varchar
VARCHAR(85)
字符集
UTF8MB4
非空
默认的
”,
算法
=复制,
锁
=共享;
查询好吧,0
行
影响(0.04sec)
记录:0副本:0
警告:0
mysql>
选择
*
从
information_schema。列
在哪里
TABLE_SCHEMA=
“测试”
和
TABLE_NAME
在
(“varchar_alter”)
和
COLUMN_NAME=
“_varchar”G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
TABLE_CATALOG:def
TABLE_SCHEMA:测试
TABLE_NAME:varchar_alter
COLUMN_NAME:_varchar
ORDINAL_POSITION:2
COLUMN_DEFAULT:
IS_NULLABLE:
没有
DATA_TYPE:
varchar
CHARACTER_MAXIMUM_LENGTH:85年
CHARACTER_OCTET_LENGTH:340年
NUMERIC_PRECISION:
零
NUMERIC_SCALE:
零
DATETIME_PRECISION:
零
CHARACTER_SET_NAME:utf8mb4
COLLATION_NAME:utf8mb4_0900_ai_ci
COLUMN_TYPE:
varchar(85)
COLUMN_KEY:
额外的:
特权:
选择,插入,更新,引用
COLUMN_COMMENT:
GENERATION_EXPRESSION:
SRS_ID:
零
1
行
在
集
(0.00sec)
|
结论
在线ALTER TABLE操作MySQL数据库管理带来灵活性,但是他们有特定的限制,尤其是在处理VARCHAR列。了解底层存储机制成功的改变是至关重要的。复制算法可以帮助管理VARCHAR扩张超出了255字节的限制,但pt-online-schema-change可以派上用场来执行操作以最小的问题。
雷竞技下载官网Percona MySQL是最完整,分布稳定、可伸缩的、安全的MySQL开源解决方案,提供企业级的数据库环境最关键业务应用程序…和它的免费使用!强>




