每(字符串类型)
有它的
拥有
字符集和排序规则元数据。
如果,当
柱
的数据类型已指定(即上次创建或更改时),没有显式给定字符集/排序规则,则该列将使用表的默认字符集和排序规则。
桌子
您在问题中引用的命令只是分别更改数据库和表的默认字符集/排序规则。换言之,它们只会影响在此之后创建的表和列
不
影响现有列(或数据)。
Changing the Character Set
手册第页的
ALTER TABLE
更改表格默认字符集和所有字符列的步骤(
CHAR
VARCHAR
,
TEXT
)要创建新的字符集,请使用以下语句:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
该语句还更改所有字符列的排序规则。如果您指定否
COLLATE
子句来指示要使用的排序规则,该语句对字符集使用默认排序规则。如果此排序规则不适合预期的表用途(例如,如果它将从区分大小写的排序规则更改为不区分大小写的排序规则),请显式指定排序规则。
瓦尔查尔
文本
类型,
CONVERT TO CHARACTER SET
根据需要更改数据类型,以确保新列的长度足以存储与原始列一样多的字符。例如,一个
文本
latin1
文本
utf8
,每个字符可能需要最多3个字节,最大可能长度为365535=196605字节。这个长度不适合一个房间
文本
列的长度字节,因此MySQL将数据类型转换为
MEDIUMTEXT
列可能转换为
中文本
.
转换为字符集
MODIFY
更改单个列。例如:
ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8;
如果您指定
CONVERT TO CHARACTER SET binary
,的
,
列被转换为相应的二进制字符串类型(
BINARY
,
VARBINARY
,
BLOB
). 这意味着列将不再具有字符集属性和后续属性
CONVERT TO
操作将不适用于它们。
如果
charset_name
是
DEFAULT
在一个
转换为字符集
操作,由
character_set_database
警告
转换为
操作在原始字符集和命名字符集之间转换列值。这是
如果在一个字符集中有一列(如
拉丁语1
)但是存储的值实际上使用了其他一些不兼容的字符集(比如
). 在这种情况下,您必须对每个此类列执行以下操作:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
这样做的原因是在转换到或从时没有转换
斑点
柱。
违约
对于表的字符集,请使用以下语句:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
违约
ALTER TABLE ... ADD column
).
foreign_key_checks
如果启用系统变量(这是默认设置),则不允许在包含外键约束中使用的字符串列的表上进行字符集转换。解决方法是禁用
外键检查
在执行字符集转换之前。在重新启用之前,必须对外键约束中涉及的两个表执行转换
外键检查
. 如果重新启用
在只转换其中一个表之后
ON DELETE CASCADE
或
ON UPDATE CASCADE
由于在这些操作期间发生的隐式转换(Bug#45290、Bug#74816),操作可能会损坏引用表中的数据。