mysql的默认排序

MyISAM与InnoDB排序
本文介绍了MySQL中MyISAM表的默认排序行为,即按照物理存储顺序显示记录,通常表现为插入顺序。同时对比了InnoDB表的排序方式,其依据主键顺序排列。此外还展示了varchar类型字段的具体排序示例。
MyISAM 表
MySQL Select 默认排序是按照物理存储顺序显示的。(不进行额外排序).也就是说SELECT * FROM tbl;会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。

InnoDB 表
同样的情况,会按主键的顺序排列。

varchar类型的字段排序方式
id为varchar
select id,account from user_userinfo order by id
结果:

[img]http://dl2.iteye.com/upload/attachment/0094/0295/578514f3-66eb-3409-9d22-ed383bd38b96.png[/img]
<think>好的,我需要回答用户关于MySQL默认排序规则的问题。首先,用户提到他们想了解MySQL默认排序规则是什么,所以我需要明确解释这个概念,并确保回答结构清晰,符合用户的要求。首先,我应该从排序规则的基本定义开始。排序规则(collation)决定了字符串比较和排序的规则,比如是否区分大小写、重音符号等。接着,需要说明MySQL默认排序规则是如何设定的,这通常与字符集(charset)相关联。每个字符集都有一个默认排序规则,例如utf8mb4的默认排序规则是utf8mb4_general_ci。这里需要确认具体的字符集对应的默认排序规则,可能需要查阅MySQL文档来确保准确性。然后,用户提供的引用中提到了不同排序规则下的例子,比如使用utf8_unicode_ci时'à'和'a'被视为相等,而使用latin1_general_cs时则不等。这说明排序规则会影响比较结果,这也需要在回答中举例说明,帮助用户理解不同排序规则的实际影响。接下来,用户还提到了默认排序的问题,特别是在没有明确指定ORDER BY时的行为。根据引用[2],MySQL默认排序不能依赖,因为如果没有ORDERBY子句,结果的顺序可能不稳定,可能会受数据存储方式或索引的影响。这部分需要强调在查询中显式使用ORDER BY的重要性,避免依赖默认排序,同时解释GROUPBY可能隐式排序的情况,但MySQL8.0之后可能有所变化,需要确认版本差异。 此外,用户可能想知道如何查看和修改默认排序规则。例如,查看数据库或表的排序规则可以使用SHOWCREATE DATABASE或SHOWTABLESTATUS,而修改则可以在创建时指定CHARACTER SET和COLLATE。这部分需要提供具体的SQL语句示例,帮助用户操作。最后,生成的相关问题需要围绕用户可能进一步关心的点,比如如何修改默认排序规则、排序规则对查询的影响、不同字符集的默认规则比较,以及默认排序是否可靠等。这些问题应覆盖用户可能遇到的实际应用场景,帮助他们深入理解和解决问题。 在回答过程中,需要确保所有数学表达式和代码块符合格式要求,行内公式用$...$,独立公式用$$...$$。同时,引用用户提供的引用内容,并在适当的位置添加引用标识,例如在讨论排序规则示例时引用[^1],在讨论默认排序不可靠时引用[^2]。总结回答结构:先解释排序规则的概念,再说明MySQL默认排序规则的设定方式,举例不同规则的影响,讨论默认排序的不确定性,最后给出查看和修改的方法,并生成相关问题。需要确保语言简洁,信息准确,引用恰当。</think>### MySQL默认排序规则详解 #### 一、排序规则的定义 排序规则(Collation)是字符集中用于**定义字符比较、排序和大小写敏感性的规则**。例如,`utf8mb4_general_ci`表示UTF8字符集下的通用排序规则,`ci`表示不区分大小写(Case Insensitive)。 #### 二、MySQL默认排序规则 1. **字符集与排序规则的关系** 每个字符集有一个默认排序规则。例如: - `utf8mb4`默认使用`utf8mb4_general_ci`[^1] - `latin1`默认使用`latin1_swedish_ci` ```sql -- 查看字符集的默认排序规则 SHOW CHARACTER SET LIKE 'utf8mb4'; ``` 2. **默认排序规则的影响** - 不指定排序规则时,MySQL会根据字符集选择默认规则。 - 示例:`utf8mb4_general_ci`会将`'a'`和`'À'`视为相等[^1]: ```sql SELECT 'à' = 'a'; -- 返回1(相等) ``` #### 三、默认排序行为的不可靠性 - **未指定`ORDER BY`时**,查询结果的顺序可能因存储引擎、索引或数据分布而变化[^2]。 - **`GROUP BY`的隐式排序**: 在MySQL 8.0之前,`GROUP BY`会按分组字段隐式排序,但可通过`ORDER BY NULL`禁用: ```sql SELECT department FROM employees GROUP BY department ORDER BY NULL; ``` #### 四、查看与修改默认排序规则 1. **查看当前设置** ```sql -- 查看数据库默认排序规则 SHOW CREATE DATABASE mydb; -- 查看表排序规则 SHOW TABLE STATUS LIKE 'mytable'; ``` 2. **修改默认排序规则** - 创建数据库时指定: ```sql CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` - 修改表排序规则: ```sql ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### 五、关键注意事项 - **显式指定排序规则**:在比较字符串时,可通过`COLLATE`强制指定规则: ```sql SELECT 'a' = 'A' COLLATE utf8mb4_general_ci; -- 返回1 SELECT 'a' = 'A' COLLATE utf8mb4_bin; -- 返回0 ``` - **索引与性能**:排序规则影响索引的匹配方式,区分大小写的规则(如`_bin`)可能需要更多存储和计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值