MariaDB字符集和排序规则(2)

尽管可以动态地设置系统变量character_set_database和collation_database,但它们用于确定数据库所使用的默认字符集和排序规则,应该尽量仅在server端进行设置。

Table级别

CREATE TABLE 和 ALTER TABLE 语句支持可选的字符集、排序规则设置子句,它们是MariaDB和MySQL对标准SQL语句的扩展。

CREATE TABLE english_names (id INT, name VARCHAR(40)) CHARACTER SET 'utf8' COLLATE 'utf8_icelandic_ci';

如果既没有指定字符集也没有指定排序规则,则采用数据库的默认值。如果仅设置了字符集,将采用字符集的默认排序规则。如果仅设置了排序规则,则排序规则相关联的字符集也会被设置。

ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

如果没有指定排序规则,将使用字符集默认的排序规则。

对于VARCHAR或TEXT类型的字段,为了保证新字段足够大以能够存储原字段的大量字符,CONVERT TO CHARACTER SET可能会改变数据类型。

例如,某TEXT类型的字段存储ascii字符时由于每个字符仅占用一个字节,因此该字段可以存储65,535个字符。如果该字段转换为UTF8,由于每个字符需要3个字节,该字段的数据类型将被转换为MEDIUMTEXT类型以便能够存储所有原字段的字符。

CONVERT TO CHARACTER SET binary将分别转换CHAR、VARCHAR和TEXT字段为BINARY、VARBINARY和BLOB,并且之后将不再具有字符集属性,或者可以在以后使用CONVERT TO CHARACTER SET语句来改变该行为。

为了避免CONVERT TO CHARACTER SET子句改变数据类型,可以在单独的字段上使用MODIFY。例如:

ALTER TABLE table_name MODIFY ascii_text_column TEXT CHARACTER SET utf8; ALTER TABLE table_name MODIFY ascii_varchar_column VARCHAR(M) CHARACTER SET utf8; Column级别

同样可以为字段类型为CHAR、TEXT或VARCHAR的字段设置字符集和排序规则。可以使用CREATE TABLE和ALTER TABLE语句进行设置——不像table级别的设置,column级别的设置是标准SQL所支持的。

CREATE TABLE european_names ( croatian_names VARCHAR(40) COLLATE 'cp1250_croatian_ci', greek_names VARCHAR(40) CHARACTER SET 'greek');

如果既没有指定字符集也没有指定排序规则,将使用表的默认值。如果仅设置了字符集,排序规则将使用字符集的默认排序规则,如果仅设置了排序规则,则其对应的字符集也会被设置。

当使用ALTER TABLE改变字段的字符集时,需要确保字符集可以和已有数据兼容。MariaDB将尽可能地一一映射转换字符数据,但无法转换的数���可能会乱码丢失。 可以使用SHOW CREATE TABLE语句,或者查询INFORMATION_SCHEMA数据库来查看字段的字符集和排序规则所采用的值。

SHOW CREATE TABLE european_names\G *************************** 1. row *************************** Table: european_names Create Table: CREATE TABLE `european_names` ( `croatian_names` varchar(40) CHARACTER SET cp1250 COLLATE cp1250_croatian_ci DEFAULT NULL, `greek_names` varchar(40) CHARACTER SET greek DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE 'european%'\G *************************** 1. row *************************** TABLE_CATALOG: def TABLE_SCHEMA: danish_names TABLE_NAME: european_names COLUMN_NAME: croatian_names ORDINAL_POSITION: 1 COLUMN_DEFAULT: NULL IS_NULLABLE: YES DATA_TYPE: varchar CHARACTER_MAXIMUM_LENGTH: 40 CHARACTER_OCTET_LENGTH: 40 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL DATETIME_PRECISION: NULL CHARACTER_SET_NAME: cp1250 COLLATION_NAME: cp1250_croatian_ci COLUMN_TYPE: varchar(40) COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT: *************************** 2. row *************************** TABLE_CATALOG: def TABLE_SCHEMA: danish_names TABLE_NAME: european_names COLUMN_NAME: greek_names ORDINAL_POSITION: 2 COLUMN_DEFAULT: NULL IS_NULLABLE: YES DATA_TYPE: varchar CHARACTER_MAXIMUM_LENGTH: 40 CHARACTER_OCTET_LENGTH: 40 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL DATETIME_PRECISION: NULL CHARACTER_SET_NAME: greek COLLATION_NAME: greek_general_ci COLUMN_TYPE: varchar(40) COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT: 文件名

从MariaDB 5.1开始,系统变量character_set_filesystem可用来控制对给定字符串的文件名解析。它会影响的下面语句和函数:

SELECT INTO DUMPFILE

SELECT INTO OUTFILE

LOAD DATA INFILE

LOAD XML

LOAD_FILE()

字面符号(译者注:可理解为常量、普通字符串或文本字符)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/42a550b8bd2ae305e4ff40f9bdb529f0.html