在 MariaDB 中设置列的字符集和排序规则

发布于

您可以在 MariaDB 中指定不同级别的字符集和排序规则。可以在连接级别、服务器级别、数据库级别、表级别甚至列级别指定它们。

还可以在查询中指定排序规则,以便它覆盖以前在上述级别指定的任何排序规则。

若要在列级别设置字符集和排序规则,请使用语句或语句(具体取决于是创建表还是修改表)。CREATE TABLE``ALTER TABLE

创建表时

下面是在创建表时在列上设置排序规则和字符集的示例:

CREATE TABLE Events ( 
    EventId INT AUTO_INCREMENT NOT NULL, 
    EventName VARCHAR(255)
        CHARACTER SET utf8
        COLLATE utf8_spanish_ci, 
    PRIMARY KEY (EventId)
    );

在这里,我在列级别指定了字符集和排序规则。也可以在表级别设置它们。

更改现有列

下面是更改现有列上的排序规则和字符集的示例:

ALTER TABLE Events 
MODIFY EventName VARCHAR(255) 
CHARACTER SET latin5 COLLATE latin5_turkish_ci;

该列现在使用新的归类和字符集。EventName

检查列

有几种方法可以检查列的排序规则和字符集。这是其中之一:

SELECT
    column_name, 
    character_set_name, 
    collation_name 
FROM information_schema.columns
WHERE table_name = 'Events'
AND column_name = 'EventName';

输出:

+-------------+--------------------+-------------------+
| column_name | character_set_name | collation_name    |
+-------------+--------------------+-------------------+
| EventName   | latin5             | latin5_turkish_ci |
+-------------+--------------------+-------------------+

归类必须对字符集有效

同时设置归类和字符集时,需要确保归类对所选字符集有效,反之亦然。否则,将返回错误。

下面是对指定字符集使用无效排序规则进行指定的示例:

ALTER TABLE Events 
MODIFY EventName VARCHAR(255) 
CHARACTER SET utf16 COLLATE latin5_turkish_ci;

输出:

ERROR 1253 (42000): COLLATION 'latin5_turkish_ci' is not valid for CHARACTER SET 'utf16'

它告诉我们,我们选择的排序规则对于我们选择的指定字符集无效。

有关匹配归类和字符集的列表,请参阅 MariaDB 支持的归类的完整列表或 MariaDB 支持的字符集的完整列表。

仅指定归类或字符集

可以只指定排序规则或仅指定字符集(或两者都不指定):

  • 如果仅提供字符集,则将使用该字符集的默认排序规则。
  • 如果仅提供排序规则,则将使用关联的字符集。
  • 如果未提供归类或字符集,则使用表默认值。

转换为需要更多字节的字符集

也可以在表级别转换字符集。在表级别转换字符集时,MariaDB 可能会自动将数据类型转换为能够更好地处理新字符集的数据类型。

但是,当我们在各个列上使用并显式指定数据类型时(就像我们在前面的例子中所做的那样),我们会阻止 MariaDB 转换数据类型。MODIFY

转换为二进制

CONVERT TO CHARACTER SET binary将分别将 和列转换为 和。CHAR``VARCHAR``TEXT``BINARY``VARBINARY``BLOB

完成此操作后,此类列将不再具有字符集。此外,它们将不再受未来报表的影响。CONVERT TO CHARACTER SET

检查 MariaDB 中的排序规则和字符集

有多种方法可以检查 MariaDB 中的排序规则和字符集,具体取决于您要检查的级别(服务器、数据库、表、列、连接等)。有关示例,请参阅在 MariaDB 中显示排序规则。