代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

MySQL字符编码更改。是否保留了数据完整性?

  •  0
  • Lajos Arpad  · 技术社区  · 6 年前

    ALTER DATABASE db_name
        [[DEFAULT] CHARACTER SET charset_name]
        [[DEFAULT] COLLATE collation_name]
    

    Source 并通过

    ALTER TABLE tbl_name
        [[DEFAULT] CHARACTER SET charset_name]
        [COLLATE collation_name]
    

    Source

    1 回复  |  直到 6 年前
        1
  •  2
  •   eggyal    6 年前

    每(字符串类型) 有它的 拥有 字符集和排序规则元数据。

    如果,当 的数据类型已指定(即上次创建或更改时),没有显式给定字符集/排序规则,则该列将使用表的默认字符集和排序规则。

    桌子

    您在问题中引用的命令只是分别更改数据库和表的默认字符集/排序规则。换言之,它们只会影响在此之后创建的表和列 影响现有列(或数据)。

    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),操作可能会损坏引用表中的数据。