📜  MySQL字符集

📅  最后修改于: 2020-11-19 04:40:52             🧑  作者: Mango

MySQL字符集

MySQL中的字符集是在字符串中合法的一组字符,编码和符号。本文介绍了如何在MySQL中获取所有字符集,如何为客户端连接配置适当的字符集以及如何在多个字符集之间转换字符串。

让我们以一个假想字符集的例子来理解它。假设我们有从A到B或从a到b的字母。接下来,我们将为每个字母分配一个数字:A = 0,B =1。这里,字母A或B是符号,数字0或1是编码。我们称这些字母(A到B或a到b)的组合及其关联的编码为字符集。

同样,如果我们要在两个字符串值之间进行比较,例如A和B。最简单的方法是使用A的编码为0,B的编码为1。从编码中可以明显看出,0小于大于1,所以我们可以说A小于B。

MySQL支持各种字符集,并且每个字符集始终使用至少一个排序规则。排序规则定义了一组规则,用于比较字符集中的字符。字符集使我们可以将任何字符存储在字符串。我们可以使用以下语句查看MySQL数据库服务器中所有可用的字符集:

SHOW CHARACTER SET;

它将返回以下输出:

默认情况下,以上语句在MySQL中产生所有可用的字符集。如果要获取任何特定字符集族的名称,请使用可选的LIKE或WHERE子句,该子句返回匹配的字符集名称。以下语句显示一些基于UTF(Unicode转换格式)的Unicode字符集:

SHOW CHARACTER SET LIKE 'utf%';

我们可以看到如下输出:

在此图像中,Maxlen列中的值表示在字符集中保存一个字符的字节数。 MySQL中的每个字符集都包含一个单字节字符,例如latin1,latin2,cp850或多字节字符。

latin1是MySQL中使用的默认字符集。如果我们将来自多种语言的字符或符号存储在一列中,则将使用Unicode字符集,例如utf8或ucs2。

MySQL LENGTH()函数以字节为单位返回字符串的长度,而CHAR_LENGTH()函数用于以字符为单位查找字符串的长度。如果我们使用LENGTH()函数来计算包含多字节字符的字符串的长度,我们得到的结果将比CHAR_LENGTH()的结果高。以下示例使用ucs2字符集对其进行了更清晰的说明。

SET @str = CONVERT('MySQL Character Set' USING ucs2);
SELECT LENGTH(@str), CHAR_LENGTH(@str);

我们可以看到如下输出,其中LENGTH函数返回的结果大于CHAR_LENGTH()的结果:

CONVERT函数用于将字符串转换为特定的字符集。上面的示例将MySQL字符集字符串转换为ucs2字符集。由于字符集ucs2包含两个字节的字符,因此@str的长度(以字节为单位)大于其长度(以个字符)。

同样,我们将看到另一个示例。请注意,许多字符集包含多字节字符,但它们的字符串仅包含单字节字符,例如utf8,如以下语句所示:

SET @str = CONVERT('MySQL Character Set' USING utf8);
SELECT LENGTH(@str), CHAR_LENGTH(@str);

我们可以看到如下输出:

但是,如果字符集utf8字符串包含任何特殊字符,则其长度(以字节为单位)将不同。请参见以下示例:

SET @string = CONVERT('pingüino' USING utf8);
SELECT LENGTH(@string), CHAR_LENGTH(@string);

我们将得到如下输出:

字符集转换

MySQL主要提供两个函数来执行不同字符集之间的字符串转换。这些函数是CONVERT()和CAST()。在上面的示例中,我们已经看到了CONVERT函数的工作。在这里,我们将仅看到CAST函数的工作,该函数类似于CONVERT函数。

以下是CONVERT()函数的基本语法:

CONVERT(expression USING character_set_name)

以下是CAST()函数的基本语法:

CAST(string AS character_type CHARACTER SET character_set_name)

请参见下面的示例,该示例使用CAST函数在不同的字符集之间进行转换:

SELECT CAST(_latin1 'MySQL character set' AS CHAR CHARACTER SET utf8mb4) CHAR_SET;

它将返回如下输出:

为客户端连接配置字符集

当数据库应用程序与MySQL服务器交换数据时,它将使用名为latin1的默认字符集。如果应用程序将Unicode字符串存储在字符集UTF8中,则数据库应用程序中的默认字符集latin1可能不足。因此,当我们的应用程序连接到MySQL数据库服务器时,需要指定正确的字符集。

我们可以使用以下方式之一为客户端连接配置字符集:

  • 当客户端与MySQL数据库服务器连接时,我们可以使用SET NAMES命令。例如,如果需要为客户端连接设置UTF8MB4 Unicode字符集,我们将使用以下语句:
SET NAMES 'utf8mb4';
  • 在MySQL中,MySQL连接器提供了其他一些字符集。假设如果使用的是PHP PDO,则可以将数据源名称中的字符集设置为以下语句:
$dsn ="mysql:host=$host;dbname=$db;charset=utf8";
  • 如果我们的数据库应用程序支持-default-character-set选项,我们还可以使用设置字符集。例如,MySQL Client Tool始终支持此选项,并且可以使用以下语句在配置文件中对其进行如下设置:
[mysql]
default-character-set= utf8

这是确保我们使用哪种方式,我们的数据库应用程序使用的字符集应与存储在MySQL服务器的字符集匹配。