• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 列字符集和校验规则

    每个“字符”列(即,类型列CHARVARCHAR中,TEXT类型,或其任何同义词)具有一列的字符集和列校验规则。列定义语法,CREATE TABLEALTER TABLE具有用于指定列字符集和校验规则的可选子句:

    col_name {CHAR | VARCHAR | TEXT} (col_length)
        [CHARACTER SET charset_name]
        [COLLATE collation_name]
    

    这些子句也可用于ENUMSET列:

    col_name {ENUM | SET} (val_list)
        [CHARACTER SET charset_name]
        [COLLATE collation_name]
    

    例子:

    CREATE TABLE t1
    (
        col1 VARCHAR(5)
          CHARACTER SET latin1
          COLLATE latin1_german1_ci
    );
    
    ALTER TABLE t1 MODIFY
        col1 VARCHAR(5)
          CHARACTER SET latin1
          COLLATE latin1_swedish_ci;
    

    MySQL通过以下方式选择列字符集和校验规则:

    • 如果同时和指定,字符集和校验规则使用。CHARACTER SET charset_nameCOLLATE collation_namecharset_namecollation_name

      CREATE TABLE t1
      (
          col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
      ) CHARACTER SET latin1 COLLATE latin1_bin;
      

      为该列指定了字符集和校验规则,因此使用它们。该列具有字符集utf8和校验规则utf8_unicode_ci

    • 如果未指定,则使用字符集及其默认校验规则。CHARACTER SET charset_nameCOLLATEcharset_name

      CREATE TABLE t1
      (
          col1 CHAR(10) CHARACTER SET utf8
      ) CHARACTER SET latin1 COLLATE latin1_bin;
      

      为该列指定了字符集,但未指定校验规则。该列字符集utf8和默认校验规则utf8,这是utf8_general_ci。要参见每个字符集的默认校验规则,请使用SHOW CHARACTER SET语句或查询INFORMATION_SCHEMACHARACTER_SETS表。

    • 如果不指定,则使用与和归类相关的字符集。COLLATE collation_nameCHARACTER SETcollation_namecollation_name

      CREATE TABLE t1
      (
          col1 CHAR(10) COLLATE utf8_polish_ci
      ) CHARACTER SET latin1 COLLATE latin1_bin;
      

      为列指定了校验规则,但没有指定字符集。该列具有校验规则utf8_polish_ci,并且字符集是与该校验规则关联的字符集,即utf8

    • 否则(既未指定,也CHARACTER SETCOLLATE指定),将使用表字符集和校验规则。

      CREATE TABLE t1
      (
          col1 CHAR(10)
      ) CHARACTER SET latin1 COLLATE latin1_bin;
      

      没有为该列指定字符集或校验规则,因此使用表的默认值。该列具有字符集latin1和校验规则latin1_bin

    CHARACTER SETCOLLATE子句是标准的SQL。

    如果ALTER TABLE用于将一列从一个字符集转换为另一个字符集,MySQL会尝试映射数据值,但是如果字符集不兼容,则可能会丢失数据。