首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql utf8二进制排序

基础概念

MySQL中的UTF-8是一种字符编码方式,用于表示Unicode字符。UTF-8编码使用1到4个字节来表示一个字符,能够覆盖Unicode标准中的所有字符。而“二进制排序”(Binary Collation)是指按照字节值的二进制表示进行比较和排序。

相关优势

  1. 兼容性:UTF-8能够表示所有Unicode字符,适用于国际化应用。
  2. 存储效率:对于ASCII字符,UTF-8只需要一个字节,比其他编码方式更节省空间。
  3. 二进制排序的准确性:二进制排序能够精确地按照字符的字节值进行比较,避免了语言相关的排序规则带来的不确定性。

类型

MySQL中有多种UTF-8编码的Collation,例如:

  • utf8_general_ci:不区分大小写,适合英语等不需要区分大小写的语言。
  • utf8_bin:二进制排序,区分大小写和重音符号。
  • utf8_unicode_ci:基于Unicode排序规则,适合多语言环境。

应用场景

  • 国际化应用:当数据库需要存储多种语言的字符时,使用UTF-8编码是最佳选择。
  • 精确排序:当需要精确控制字符的排序顺序时,使用二进制排序(如utf8_bin)。

遇到的问题及解决方法

问题:为什么使用utf8_general_ci排序时,某些字符的顺序不正确?

原因utf8_general_ci是一种不区分大小写的Collation,但它并不完全遵循Unicode排序规则,可能会导致某些语言的字符排序不准确。

解决方法

  1. 更换Collation:使用utf8_unicode_ciutf8_bin来替代utf8_general_ci
  2. 更换Collation:使用utf8_unicode_ciutf8_bin来替代utf8_general_ci
  3. 自定义排序规则:如果需要特定的排序规则,可以考虑使用ORDER BY子句结合自定义的排序函数。

问题:为什么在使用utf8_bin时,查询速度变慢?

原因utf8_bin进行二进制比较,计算量较大,尤其是在大数据量的情况下。

解决方法

  1. 索引优化:确保在需要排序的字段上创建索引。
  2. 索引优化:确保在需要排序的字段上创建索引。
  3. 查询优化:尽量减少不必要的二进制比较,可以通过预处理数据或使用其他Collation来优化查询。

示例代码

假设有一个表users,其中有一个字段name,我们希望按照二进制排序查询:

代码语言:txt
复制
-- 创建表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin
);

-- 插入数据
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('alice'), ('bob');

-- 查询并按二进制排序
SELECT * FROM users ORDER BY name COLLATE utf8_bin;

参考链接

希望这些信息对你有所帮助!如果有更多问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL不要再用utf8了

utf8mb4才是真正的UTF-8 没错,MySQL中的utf8mb4才是真正的UTF-8,MySQL中的utf8其实是一种专属的编码,它能编码的Unicode字符并不多。...所有还在使用utf8编码格式的MySQL和MariaDB用户都应该改成utf8mb4,且不再使用utf8,避免出现类似的问题。...历史问题分析 为什么MySQL中的utf8不是真正的UTF-8? 或许从MySQL的更新日志中可以找到答案。...不过很显然,在这个不合法的字符集发布之后,MySQL就无法修复它,因为这样需要要求所有的用户重构他们的数据库,所以MySQL中utf8还是最多支持3个字节,最终,MySQL在2010年发布了utf8mb4...综上 相信很多同学还不知道这个知识点,主要是目前网络上大多数的文章教程都把MySQL中的utf8当成正真的UTF-8,因此希望看到这篇文章的小伙伴能有所收获并广而告之。

2.1K20

MySQL中的utf8,真假?

MySQL建表过程中,可能会碰到这个问题, Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, but...究其原因,MySQL的"utf8"实际上不是真正的UTF-8。"utf8"只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。...MySQL的"utf8"是一种"专属的编码",它能够编码的Unicode字符并不多。 所有在使用"utf8"的MySQL和MariaDB用户都应该改用"utf8mb4",不要再使用"utf8"。...归根结底,文章开头提到的问题,就是因为MySQL的"utf8"字符集与其他程序不兼容,因此,如果你在使用MySQL或MariaDB,不要用"utf8"编码,改用"utf8mb4"。...这里提供了一个指南用于将现有数据库的字符编码从"utf8"转成"utf8mb4", https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

4600
  • MySQL中使用utf8的见解

    《MySQL中的utf8,真假?》中曾提到MySQL的utf8字符集问题,碰巧看到技术社群的这篇文章《为什么不建议在 MySQL 中使用 utf8 ?》给出一些网友对这个问题的观点,可以学习参考。...为什么不建议在MySQL中使用utf8 ?...所以,MySQL只好保留了bug版的优化utf8,然后整了个utf8mb4来重新支持utf8标准。 MySQL的这个教训说明: 对于标准化的东西,别瞎捉摸; 你的理解再怎么自认为有道理,没用!...当使用utf8mb4字符集时,通常推荐使用utf8mb4_unicode_ci或utf8mb4_general_ci排序规则。...在 MySQL 中,“utf8”是指支持 Unicode 字符集的字符编码,每个字符最多使用三个字节。然而,MySQL 中原始的 utf8 实现并没有涵盖所有 Unicode 字符。

    9310

    永远不要在 MySQL 中使用“utf8”

    问题的症结在于,MySQL 的“utf8”实际上不是真正的 UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。...简单概括如下: MySQL 的“utf8mb4”是真正的“UTF-8”。 MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。...我要在这里澄清一下:所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。 那么什么是编码?什么是 UTF-8?...MySQL 的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨…… MySQL 简史 为什么 MySQL 开发者会让“utf8”失效?我们或许可以从提交日志中寻找答案。...将 CHAR 列的编码设置为“utf8”。 我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。 所以结果就是没有赢家。

    89530

    记住,永远不要在MySQL中使用“utf8”

    问题的症结在于,MySQL 的“utf8”实际上不是真正的 UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。...简单概括如下: MySQL 的“utf8mb4”是真正的“UTF-8”。 MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。...我要在这里澄清一下:所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。 1 什么是编码?什么是 UTF-8?...MySQL 的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨…… 2 好好 MySQL 简史 为什么 MySQL 开发者会让“utf8”失效?...将 CHAR 列的编码设置为“utf8”。 我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。 所以结果就是没有赢家。

    69040

    记住,永远不要在 MySQL 中使用 “utf8”

    问题的症结在于,MySQL 的“utf8”实际上不是真正的 UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。...简单概括如下: MySQL 的“utf8mb4”是真正的“UTF-8”。 MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。...我要在这里澄清一下:所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。 那么什么是编码?什么是 UTF-8?...MySQL 的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨…… MySQL 简史 为什么 MySQL 开发者会让“utf8”失效?我们或许可以从提交日志中寻找答案。...将 CHAR 列的编码设置为“utf8”。 我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。 所以结果就是没有赢家。

    66920

    谨记不要在MySQL中使用“utf8”编码

    谨记不要在MySQL中使用“utf8”编码 掉坑回顾: 最近在工作中遇到一个BUG,用于记录客户昵称的数据表,在插入带有表情的字符时候报错.使用的存储引擎是INNODB,当我查看数据库字段的时候确实是设置的...直到我深入了解才发自己使用的姿势并不对,mysql数据库中的"utf8"并不是真正的utf8编码,关于这个问题mysql官方一直未能修复,取而代之的推出了utf8mb4,这一点让我记忆犹新,切记mysql...1.BUG重现 这里我做了一个简单的试验,来验证utf8在mysql中存在的问题: 建立数据表: CREATE TABLE `user` ( `id` int(10) NOT NULL AUTO_INCREMENT...2.Mysql遗留问题 这个问题的症结在于,Mysql的"utf8"并不是真正的UTF-8....简单归纳综合如下: MySQL 的“utf8mb4”是真正的“UTF-8”,MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符其实不多,所以在使用mysql的时候还是用

    1.2K30

    为什么不建议在MySQL中使用 utf8 ?

    MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。 如果使用 utf8 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。 为什么会这样呢?...我们将字符对应二进制数据的过程称为"字符编码",反之,二进制数据解析成字符的过程称为“字符解码”。 有哪些常见的字符集? 常见的字符集有 ASCII、GB2312、GBK、UTF-8......。...MySQL 字符编码集中有两套 UTF-8 编码实现: utf8 :utf8编码只支持1-3个字节 。在 utf8 编码中,中文是占 3 个字节,其他数字、英文、符号占一个字节。...原因如下: 因此,如果你需要存储emoji类型的数据或者一些比较复杂的文字、繁体字到 MySQL 数据库的话,数据库的编码一定要指定为utf8mb4 而不是utf8 ,要不然存储的时候就会报错了。...(环境:MySQL 5.7+) 建表语句如下,我们指定数据库 CHARSET 为 utf8 。

    1.1K20

    为什么不建议在MySQL中使用UTF8?

    MySQL字符串编码集中有两套UTF-8编码实现:utf8和utf8mb4 如果使用utf8的话,存储emoji符号和一些比较复杂的汉字,繁体字就会出错。...计算机只能存储二进制的数据,那么英文,汉字,表情等字符串应该如何存储呢? 我们要将这些字符和二进制的数据一一对应,比如说字符串“a”对应“01100001”,反之“01100001”对应“a”。...我们将字符串对应二进制数据的过程称为“字符编码”,反之,二进制数据解析成字符的过程称为“字符解码”。...字符编码集中有两套UTF-8编码实现: utf8:utf编码只支持1-3个字节。...最多支持4个字节表示字符,因此,可以用来存储emoji符号 4.演示 环境:MySQL 5.7+ 数据库CHARSET:utf8 CREATE TABLE `user` ( `id` varchar

    75030

    转载:记住,永远不要在 MySQL 中使用“utf8”

    问题的症结在于,MySQL 的“utf8”实际上不是真正的 UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。...简单概括如下: MySQL 的“utf8mb4”是真正的“UTF-8”。 MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。...我要在这里澄清一下:所有在使用“utf8”的 MySQL 和 MariaDB 用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。 那么什么是编码?什么是 UTF-8?...MySQL 的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨…… MySQL 简史 为什么 MySQL 开发者会让“utf8”失效?我们或许可以从提交日志中寻找答案。...将 CHAR 列的编码设置为“utf8”。 我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。 所以结果就是没有赢家。

    44110

    SQL学习笔记之MySQL中真假“utf8” 问题

    0x00 MySQL中UTF8报错 最近我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个离奇的错误: Incorrect...问题的症结在于,MySQL 的“utf8”实际上不是真正的 UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。...简单概括如下: MySQL 的“utf8mb4”是真正的“UTF-8”。 MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。...MySQL 的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨…… 0x02 MySQL中的UTF8简史 为什么 MySQL 开发者会让“utf8”失效?...最终,MySQL 在 2010 年重新发布了“utf8mb4”来支持真正的 UTF-8。 0x03 MySQL中UTF8报错 因为这个问题,我整整抓狂了一个礼拜。

    86920

    【mysql】order by排序

    排序数据 1. 排序规则 如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的。 使用 ORDER BY 对查询到的数据进行排序操作。...使用 ORDER BY 子句排序 ASC(ascend): 升序 DESC(descend):降序 ORDER BY 子句在SELECT语句的结尾。 2....单列排序 按照salary从高到低的顺序显示员工信息 SELECT employee_id,last_name,salary FROM employees ORDER BY salary DESC; [...BY department_id DESC,salary ASC; [在这里插入图片描述] 可以使用不在SELECT列表中的列排序。...在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。

    2.4K60

    MySQL 排序规则

    排序规则是一组用于比较字符集中的字符的规则。 每个 MySQL 字符集可以支持一个或者多个排序规则,用于定义每个字符的比较规则,包括是否区分大小写,是否区分重音等。...2.支持的排序规则 MySQL 使用 SHOW COLLATION 语句查看各种字符集支持的排序规则: SHOW COLLATION [LIKE 'pattern' | WHERE expr]...这是MySQL内部使用的标识符。 Default:是否为默认排序规则。如果是默认排序规则,将显示“Yes”;否则,显示“”No”。 Compiled:是否已编译排序规则。...如果没有指定排序规则,MySQL 会基于字符集设置一个默认的排序规则。...英文通常按照字母排序,而中文通常按照拼音、偏旁部首或者笔画进行排序。 MySQL 8.0 默认使用的排序规则 utf8mb4_0900_ai_ci 对于中文按照偏旁部首进行排序。

    47520
    领券