列字符集和校验规则
每个“字符”列(即,类型列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_name
COLLATE collation_name
charset_name
collation_name
CREATE TABLE t1 ( col1 CHAR(10)CHARACTER SET utf8COLLATE utf8_unicode_ci )CHARACTER SET latin1COLLATE latin1_bin;为该列指定了字符集和校验规则,因此使用它们。该列具有字符集
utf8
和校验规则utf8_unicode_ci
。如果未指定,则使用字符集及其默认校验规则。
CHARACTER SET charset_name
COLLATE
charset_name
CREATE TABLE t1 ( col1 CHAR(10)CHARACTER SET utf8 )CHARACTER SET latin1COLLATE latin1_bin;为该列指定了字符集,但未指定校验规则。该列字符集
utf8
和默认校验规则utf8
,这是utf8_general_ci
。要参见每个字符集的默认校验规则,请使用SHOW CHARACTER SET
语句或查询INFORMATION_SCHEMA
CHARACTER_SETS
表。如果不指定,则使用与和归类相关的字符集。
COLLATE collation_name
CHARACTER SET
collation_name
collation_name
CREATE 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会尝试映射数据值,但是如果字符集不兼容,则可能会丢失数据。