SQL经典案例之常见的字符集和排序规则+中文的排序方式
在创建数据库或表时,通常会指定一个字符集和排序规则:
- 字符集:决定数据库可以存储哪些字符。
- 排序规则:决定字符的比较和排序方式。
常见字符集(Character Set)
ASCII
- ASCII:
- 最早的字符集,仅支持英文字符、数字和部分控制字符。
- 使用 7 位编码,共 128 个字符。
- ISO-8859-1(Latin-1):
- 扩展了 ASCII,支持西欧语言字符。
- 使用 8 位编码,共 256 个字符。
GB2312
- GBK:
- 支持简体中文,每个中文字符占用 2 个字节
- 使用 2 字节编码,兼容 GB2312
- GB18030:
- 支持简体中文的扩展字符集,兼容 GBK
- 使用 1、2 或 4 字节编码
Unicode
- UTF-8:
- 支持全球所有语言的字符,是 Unicode 的一种实现方式,每个中文字符占用 3 个字节
- 可变长度编码(1 到 4 字节),兼容 ASCII
- UTF-16:
- 另一种 Unicode 实现方式,使用 2 或 4 字节编码
- 适合存储大量非 ASCII 字符
排序规则(Collation)
排序规则定义了字符的比较和排序方式。它基于字符集,但可以进一步指定语言、区域和排序规则的具体行为。
排序规则的作用
- 决定字符串的比较方式(如大小写敏感、重音敏感等)。
- 影响
ORDER BY
、GROUP BY
和索引的排序行为。 - 影响字符串的匹配和搜索(如
LIKE
和=
操作)。
常见的排序规则属性
- 大小写敏感(Case Sensitivity):
- 是否区分大小写(如
A
和a
是否相同)。 - 示例:
utf8_general_ci
(不区分大小写),utf8_bin
(区分大小写)。
- 是否区分大小写(如
- 重音敏感(Accent Sensitivity):
- 是否区分重音字符(如
é
和e
是否相同)。 - 示例:
utf8_unicode_ci
(不区分重音),utf8_unicode_cs
(区分重音)。
- 是否区分重音字符(如
- 语言和区域设置:
- 根据特定语言或区域的规则进行排序(如德语、法语等)。
- 示例:
utf8_german2_ci
(德语排序规则)。
常见排序规则示例
- Oracle:默认AL32UTF8字符编码,中文按照偏旁部首排序
– NLS_SORT:定义字符串的比较和排序规则,是否区分大小写、是否区分重音等
– NLS_COMP:定义字符串比较的行为,通常与 NLS_SORT 配合使用
-- 查看当前排序规则:
SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER IN ('NLS_SORT', 'NLS_COMP');
-- 基于二进制值排序
ALTER SESSION SET NLS_SORT = 'BINARY'; -- 区分大小写的排序
ALTER SESSION SET NLS_SORT = 'BINARY_CI'; -- 不区分大小写的排序
-- 基于 Unicode 标准进行排序
ALTER SESSION SET NLS_SORT = 'UTF8_UNICODE_CI'; -- 不区分大小写
ALTER SESSION SET NLS_SORT = 'UTF8_UNICODE_CS'; -- 区分大小写
-- 基于语言排序规则
ALTER SESSION SET NLS_SORT = 'GERMAN'; -- 德语排序规则
ALTER SESSION SET NLS_SORT = 'FRENCH'; -- 法语排序规则
-- SQL语句指定中文排序规则
SELECT last_name FROM employees
ORDER BY NLSSORT(last_name, 'NLS_SORT=SCHINESE_PINYIN_M');
-- SCHINESE_PINYIN_M: 中文拼音排序
-- SCHINESE_RADICAL_M: 偏旁部首排序
-- SCHINESE_STROKE_M: 笔画排序
复制
NLSSORT()是Oracle提供的一个系统函数,用于返回按照指定排序规则编码的字符序列
-- 查询数据库的字符集
SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
-- 查询会话的字符集和排序规则
SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_SORT');
-- 查询实例的字符集和排序规则
SELECT * FROM nls_instance_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_SORT');
复制
- MySQL:8.0默认utf8mb4字符编码,中文按照偏旁部首排序
utf8mb4_general_ci
:不区分大小写和重音。utf8mb4_bin
:区分大小写和重音。utf8mb4_unicode_ci
:基于 Unicode 规则,支持多语言。
-- SQL语句指定中文排序规则
SELECT last_name FROM employees
ORDER BY CONVERT(last_name using GBK);
复制
CONVERT()是MySQL提供的一个系统函数,用于转换数据的字符集编码
-- 查询当前数据库的字符集和排序规则
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- 查询表的字符集和排序规则
SHOW CREATE TABLE your_table_name;
-- 查询列的字符集和排序规则
SHOW FULL COLUMNS FROM your_table_name;
复制
- SQL Server:字符集和排序规则是一个概念,默认按安装OS区域设置,中国地区默认Chinese_PRC_CS,中文按照偏旁部首排序
Latin1_General_CI_AS
:不区分大小写,区分重音。SQL_Latin1_General_CP1_CI_AS
:基于 Latin1 字符集,不区分大小写,区分重音。
-- SQL语句指定Chinese_PRC_CI_AI_KS_WS中文拼音排序规则
SELECT last_name FROM employees
ORDER BY last_name COLLATE Chinese_PRC_CI_AI_KS_WS;
复制
COLLATE关键字实现其他方式的中文排序
-- 查询服务器级别的排序规则
SELECT SERVERPROPERTY('Collation');
-- 查询数据库级别的排序规则
SELECT name, collation_name
FROM sys.databases
WHERE name = 'your_database_name';
-- 查询表或列的排序规则(注意:表或列本身不直接存储排序规则,但可以从数据类型推断)
SELECT COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name';
复制
- PostgreSQL:默认UTF-8字符编码,中文按照偏旁部首排序
-- SQL语句指定zh_CN中文拼音排序规则
SELECT last_name FROM employees
ORDER BY last_name COLLATE "zh_CN";
复制
COLLATE关键字可以用于转换数据的字符集编码
-- 数据库编码和排序规则查询
select datname,pg_encoding_to_char(encoding),datcollate,datctype from pg_database;
select datname,pau.rolname,pg_encoding_to_char(encoding),datcollate,datctype
from pg_database pdb,pg_authid pau where pdb.datdba=pau.oid;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1261次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
762次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
675次阅读
2025-03-06 09:41:49
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
DarkAthena
559次阅读
2025-03-04 14:33:31
玩一玩系列——玩玩pg_mooncake(PostgreSQL的高性能列存新贵)
小满未满、
520次阅读
2025-03-03 17:18:03
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
508次阅读
2025-03-05 00:42:34
MySQL8.0统计信息总结
闫建(Rock Yan)
478次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
451次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
444次阅读
2025-03-04 21:56:13
【ORACLE】char类型和sql优化器发生的“错误”反应
DarkAthena
403次阅读
2025-03-04 23:05:01