列字符集和校验规则
每个“字符”列(即,类型列CHAR,VARCHAR中,TEXT类型,或其任何同义词)具有一列的字符集和列校验规则。列定义语法,CREATE TABLE并ALTER TABLE具有用于指定列字符集和校验规则的可选子句:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
这些子句也可用于ENUM和SET列:
col_name {ENUM | SET } (val_list)
[CHARACTER SET charset_name]
[COLLATE collation_name]
例子:
CREATE TABLE t1 ( col1 VARCHAR(5)CHARACTER SET latin1COLLATE latin1_german1_ci );ALTER TABLE t1MODIFY col1 VARCHAR(5)CHARACTER SET latin1COLLATE latin1_swedish_ci;
MySQL通过以下方式选择列字符集和校验规则:
如果同时和指定,字符集和校验规则使用。
CHARACTER SET charset_nameCOLLATE collation_namecharset_namecollation_nameCREATE TABLE t1 ( col1 CHAR(10)CHARACTER SET utf8COLLATE utf8_unicode_ci )CHARACTER SET latin1COLLATE latin1_bin;为该列指定了字符集和校验规则,因此使用它们。该列具有字符集
utf8和校验规则utf8_unicode_ci。如果未指定,则使用字符集及其默认校验规则。
CHARACTER SET charset_nameCOLLATEcharset_nameCREATE TABLE t1 ( col1 CHAR(10)CHARACTER SET utf8 )CHARACTER SET latin1COLLATE latin1_bin;为该列指定了字符集,但未指定校验规则。该列字符集
utf8和默认校验规则utf8,这是utf8_general_ci。要参见每个字符集的默认校验规则,请使用SHOW CHARACTER SET语句或查询INFORMATION_SCHEMACHARACTER_SETS表。如果不指定,则使用与和归类相关的字符集。
COLLATE collation_nameCHARACTER SETcollation_namecollation_nameCREATE TABLE t1 ( col1 CHAR(10)COLLATE utf8_polish_ci )CHARACTER SET latin1COLLATE latin1_bin;为列指定了校验规则,但没有指定字符集。该列具有校验规则
utf8_polish_ci,并且字符集是与该校验规则关联的字符集,即utf8。否则(既未指定,也
CHARACTER SET未COLLATE指定),将使用表字符集和校验规则。CREATE TABLE t1 ( col1 CHAR(10) )CHARACTER SET latin1COLLATE latin1_bin;没有为该列指定字符集或校验规则,因此使用表的默认值。该列具有字符集
latin1和校验规则latin1_bin。
在CHARACTER SET与COLLATE子句是标准的SQL。
如果ALTER TABLE用于将一列从一个字符集转换为另一个字符集,MySQL会尝试映射数据值,但是如果字符集不兼容,则可能会丢失数据。
