MySQL 字符集

一、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 函数的工作原理。在这里,我们将只看到与 CONVERT 函数类似的 CAST 函数的工作。

以下是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 的默认字符集。如果应用程序以字符集 UTF8 存储 Unicode 字符串,那么数据库应用程序中的默认字符集 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服务器中的字符集相匹配。

热门文章

优秀文章