# 10.3.5 列字符集和排序规则
每个“字符”列(即类型的列字符
,VARCHAR
, 一种文本
type 或任何同义词)具有列字符集和列排序规则。列定义语法创建表
和更改表
具有用于指定列字符集和排序规则的可选子句:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
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 以下列方式选择列字符集和排序规则:
如果两者
字符集 *
字符集名称*
和整理 *
collation_name*
已指定,字符集*字符集名称
和整理collation_name
*被使用。CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci ) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集和排序规则,因此使用它们。该列具有字符集
utf8
和整理utf8_unicode_ci
.如果
字符集 *
字符集名称*
没有指定整理
, 字符集*字符集名称
*并使用其默认排序规则。CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8 ) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集,但没有指定排序规则。该列具有字符集
utf8
和默认排序规则utf8
,即utf8_general_ci
.要查看每个字符集的默认排序规则,请使用显示字符集
声明或查询INFORMATION_SCHEMA
CHARACTER_SETS
桌子。如果
整理 *
collation_name*
没有指定字符集
, 与相关的字符集*collation_name
和整理collation_name
*被使用。CREATE TABLE t1 ( col1 CHAR(10) COLLATE utf8_polish_ci ) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了排序规则,但没有指定字符集。该列有排序规则
utf8_polish_ci
并且字符集是与排序规则相关联的字符集,即utf8
.否则(两者都不
字符集
也不整理
已指定),使用表字符集和排序规则。CREATE TABLE t1 ( col1 CHAR(10) ) CHARACTER SET latin1 COLLATE latin1_bin;
没有为该列指定字符集或排序规则,因此使用表默认值。该列具有字符集
拉丁语1
和整理latin1_bin
.这
字符集
和整理
子句是标准 SQL。如果你使用
更改表
要将列从一个字符集转换为另一个,MySQL 会尝试映射数据值,但如果字符集不兼容,则可能会丢失数据。