MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • MySQL字符集简介
  • 转换不同的字符集
  • 设置客户端连接的字符集

Was this helpful?

  1. 第一章 基础教程
  2. 第十五节 全球化

15.1 字符集

Previous第十五节 全球化Next15.2 校对规则

Last updated 5 years ago

Was this helpful?

在本教程中,您将了解MySQL中的字符集。 在本教程之后,您将了解如何获取MySQL中的所有字符集,如何在字符集之间转换字符串以及如何为客户端连接配置正确的字符集。

MySQL字符集简介

MySQL字符集是一组在字符串中合法的字符。 例如,我们有一个从a到z的字母。要为每个字母分配一个数字,例如a = 1,b = 2等。字母a是一个符号,数字1与字母a相关联就是一种编码。 从a到z的所有字母和它们相应的编码的组合是一个字符集。

每个字符集具有一个或多个排序规则,其定义用于比较字符集中的字符的一组规则。 查看,了解MySQL排序规则。

MySQL支持各种字符集,允许您几乎可将每个字符存储在字符串中。 要获取MySQL数据库服务器中的所有可用字符集,请使用SHOW CHARACTER SET语句如下:

mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set

MySQL中的默认字符集是latin1。如果要在单列中存储多种语言的字符,可以使用Unicode字符集,即utf8或ucs2。

Maxlen列中的值指定字符集中的字符持有的字节数。一些字符集包含单字节字符,例如:latin1,latin2,cp850等,而其他字符集包含多字节字符。

MySQL提供了LENGTH函数来获取字节的长度,以字节为单位,CHAR_LENGTH函数用于获取字符串的长度。如果字符串包含多字节字符,则LENGTH函数的结果大于CHAR_LENGTH()函数的结果。 请参阅以下示例:

SET @str = CONVERT('我的MySQL' USING ucs2);

SELECT LENGTH(@str), CHAR_LENGTH(@str);、

执行上面查询,得到以下结果 -

+--------------+-------------------+
| LENGTH(@str) | CHAR_LENGTH(@str) |
+--------------+-------------------+
|           14 |                 7 |
+--------------+-------------------+
1 row in set

CONVERT函数将字符串转换为指定的字符集。在这个例子中,它将MySQL字符集字符串的字符集转换为ucs2。 因为ucs2字符集包含2个字节的字符,因此@str字符串的长度(以字节为单位)大于其字符长度。

请注意,某些字符集包含多字节字符,但其字符串可能只包含单字节字符,例如utf8,如以下语句所示:

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

执行上面查询语句,得到以下结果 -

+--------------+-------------------+
| LENGTH(@str) | CHAR_LENGTH(@str) |
+--------------+-------------------+
|           19 |                19 |
+--------------+-------------------+
1 row in set

但是,如果utf8字符串包含特殊字符,例如ü在pingüino字符串中; 其字节长度不同,请参见以下示例:

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

执行上面查询语句,得到以下结果 -

+--------------+-------------------+
| LENGTH(@str) | CHAR_LENGTH(@str) |
+--------------+-------------------+
|            9 |                 8 |
+--------------+-------------------+
1 row in set

一个使用中文的示例 -

SET @str = CONVERT('不要问我有多长' USING utf8);
SELECT LENGTH(@str), CHAR_LENGTH(@str);

执行上面查询语句,得到以下结果 -

+--------------+-------------------+
| LENGTH(@str) | CHAR_LENGTH(@str) |
+--------------+-------------------+
|           21 |                 7 |
+--------------+-------------------+
1 row in set

在使用utf8字符集编码时,中文字占3个长度。

转换不同的字符集

MySQL提供了两个函数,允许您在不同字符集之间转换字符串:CONVERT和CAST。 在上面的例子中,我们多次使用了CONVERT函数。

CONVERT函数的语法如下:

CONVERT(expression USING character_set_name)

CAST函数类似于CONVERT函数。它将字符串转换为不同的字符集:

CAST(string AS character_type CHARACTER SET character_set_name)

看一下使用CAST函数的以下示例:

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

执行上面查询语句,得到以下结果 -

+---------------------------------------------------------------+
| CAST(_latin1'MySQL character set' AS CHAR CHARACTER SET utf8) |
+---------------------------------------------------------------+
| MySQL character set                                           |
+---------------------------------------------------------------+
1 row in set

设置客户端连接的字符集

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

要配置客户端连接的字符集,可以执行以下方式之一:

  • 客户端连接到MySQL数据库服务器后发出SET NAME语句。 例如,要设置Unicode字符集utf8,请使用以下语句:

    SET NAMES 'utf8';
  • 如果应用程序支持--default-character-set选项,则可以使用它来设置字符集。 例如,mysql客户端工具支持--default-character-set,您可以在配置文件中进行如下设置:

    [mysql]
    default-character-set=utf8
  • 一些MySQL连接器允许您设置字符集,例如,如果您使用PHP PDO,则可以按如下方式设置数据源名称中的字符集:

    $dsn ="mysql:host=$host;dbname=$db;charset=utf8";

无论使用哪种方式,请确保应用程序使用的字符集与存储在MySQL数据库服务器中的字符集匹配。

在本教程中,您已经了解了MySQL字符集,如何在字符集之间转换字符串以及如何为客户端连接配置正确的字符集。

MySQL排序规则教程