iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >第07期:有关 MySQL 字符集的 SQL 语句
  • 405
分享到

第07期:有关 MySQL 字符集的 SQL 语句

第07期:有关MySQL字符集的SQL语句 2016-12-19 11:12:17 405人浏览 猪猪侠
摘要

本篇为理清字符集的续篇(上一篇:第06期:梳理 Mysql 字符集的相关概念),重点讲述字符集涉及到的 sql 语句用法。 一、character introducer 翻译过来就是字符引导。也就是针对字符串,显式的给定一个字符编码和

第07期:有关 MySQL 字符集的 SQL 语句

本篇为理清字符集的续篇(上一篇:第06期:梳理 Mysql 字符集的相关概念),重点讲述字符集涉及到的 sql 语句用法。

一、character introducer

翻译过来就是字符引导。也就是针对字符串,显式的给定一个字符编码和排序规则,不受系统参数的影响。

语法很简单:

[_charset_name]"string" [COLLATE collation_name] 

示例:

字符串 "北京加油❤!"

-- 字符集 utf8mb4,排序规则 utf8mb4_bin
select _utf8mb4 "北京加油❤!" collate utf8mb4_bin as result;
+------------------+
| result           |
+------------------+
| 北京加油❤!       |
+------------------+
1 row in set (0.00 sec)


-- 字符集 utf8mb4,collate 字句缺失,此时对应排序规则为utf8mb4_w0900_ai_ci
select _utf8mb4 "北京加油❤!" as result;
+------------------+
| result           |
+------------------+
| 北京加油❤!       |
+------------------+
1 row in set (0.00 sec)

-- 字符集缺失,此时字符集按照参数 @@character_set_connection 值来指定。
mysql> select "北京加油❤!" collate gb18030_chinese_ci as result;
ERROR 1253 (42000): COLLATION "gb18030_chinese_ci" is not valid for CHARACTER SET "utf8mb4"

-- 查看变量 @@character_set_connection,确认其字符集不包含排序规则 gb18030_chinese_ci,所以以上语句报错。
mysql> select @@character_set_connection;
+----------------------------+
| @@character_set_connection |
+----------------------------+
| utf8mb4                    |
+----------------------------+
1 row in set (0.00 sec)

-- 那给下正确的排序规则 utf8mb4_bin,执行正确。

mysql> select "北京加油❤!" collate utf8mb4_bin as result;
+------------------+
| result           |
+------------------+
| 北京加油❤!       |
+------------------+
1 row in set (0.00 sec)


-- 字符集和排序规则都不指定,此时字符串对应的字符集和排序规则和参数 @@character_set_connection 一致。
select "北京加油❤!" as result;
-- 那这条语句其实被 mysql 解释为
select _utf8mb4 "北京加油❤!" collate utf8mb4_0900_ai_ci as result;

总结 Introducer 使用规则:

字符集 排序规则 字符串确认规则
指定 指定 按照指定确认
指定 缺失 按照指定字符集对应的默认排序规则确认
缺失 指定 按照 @@character_set_connection 的值确认,排序规则与字符集不匹配则报错
缺失 缺失 按照 @@character_set_connection 的值确认

二、字符集转换函数

1. convert 函数

convert 函数类似于 introducer,不过只能指定字符集。

举个例子,通过 convert 函数转换字符串 "北京加油❤!" 的编码为 utf8mb4。不过前提是转换前后字符集一定要兼容。

-- 正确的转换
mysql> select convert("北京加油❤!" using utf8mb4) ;
+-------------------------------------------+
| convert("北京加油❤!" using utf8mb4)       |
+-------------------------------------------+
| 北京加油❤!                                |
+-------------------------------------------+
1 row in set (0.00 sec)

-- 错误的转换,字符集编码不兼容。

mysql> select convert("北京加油❤!" using latin1) ;
+------------------------------------------+
| convert("北京加油❤!" using latin1)       |
+------------------------------------------+
| ?????!                                   |
+------------------------------------------+
1 row in set (0.00 sec)

2. charset 函数

检测字符串的字符集。可以检测出当前字符串在当前 session 的字符集。

mysql> set @a="北京加油❤!";
Query OK, 0 rows affected (0.00 sec)

mysql> select charset(@a);
+-------------+
| charset(@a) |
+-------------+
| utf8        |
+-------------+
1 row in set (0.00 sec)

3. set names 语句

语法为:

SET NAMES {"charset_name"
[COLLATE "collation_name"] | DEFAULT}

这条语句最常用,可是也最容易被滥用,比如语句

set names latin1 collate latin1_bin;

执行后会默认执行一系列语句,也就是把非服务端的相关参数给重新设定了。

set session character_set_results = latin1;

set session character_set_client = latin1;

set session character_set_connection=latin1;  

set session collation_connection = latin1_bin;

那现在重新执行确认一下,跟 introducer 一样,没有指定 collate 语句,默认为字符集对应的排序规则。

mysql> set names latin1 ;
Query OK, 0 rows affected (0.00 sec)

-- 那这里看到相关参数值全部被改了。

mysql> select * from perfORMance_schema.session_variables where variable_name in ("character_set_connection","collation_connection","character_set_results","character_set_client");
+--------------------------+-------------------+
| VARIABLE_NAME            | VARIABLE_VALUE    |
+--------------------------+-------------------+
| character_set_client     | latin1            |
| character_set_connection | latin1            |
| character_set_results    | latin1            |
| collation_connection     | latin1_swedish_ci |
+----------------------------------------------+

那如果想改回默认值,简单执行:

mysql> set names default;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from performance_schema.session_variables where variable_name in ("character_set_connection","collation_connection","character_set_results","character_set_client");
+--------------------------+--------------------+
| VARIABLE_NAME            | VARIABLE_VALUE     |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_results    | utf8mb4            |
| collation_connection     | utf8mb4_0900_ai_ci |
+--------------------------+--------------------+
4 rows in set (0.00 sec)

不过有一点要注意的是,并不是所有字符集都适用于这条语句,比如定长字符集 utf32,设置就会报错。因为变量 @@character_set_client 不支持这个字符集。

mysql> set names utf32;
ERROR 1231 (42000): Variable "character_set_client" can"t be set to the value of "utf32"

4. set character set 语句

语法为:

SET {CHARACTER SET | CHARSET}
{"charset_name" | DEFAULT}

类似语句 set names,同样是设置以下三个 session 参数:

  • character_set_results
  • character_set_client
  • character_set_connection

同样是可以恢复默认值,还有同样的限制规则等。

不过有两点不同:

  1. 参数 character_set_connection 的值不会被设定为指定的字符集,而是继承参数 character_set_database 所设定的字符集。

示例:

mysql> set character set latin1;
Query OK, 0 rows affected (0.01 sec)

-- 检索结果显示,参数 character_set_connection 的值和 character_set_database 的值一致。
mysql> select * from performance_schema.session_variables where variable_name in ("character_set_connection","collation_connection","character_set_database","character_set_results","character_set_client");
+--------------------------+--------------------+
| VARIABLE_NAME            | VARIABLE_VALUE     |
+--------------------------+--------------------+
| character_set_client     | latin1             |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_results    | latin1             |
| collation_connection     | utf8mb4_0900_ai_ci |
+--------------------------+--------------------+
5 rows in set (0.00 sec)
  1. 只用来设置字符集,不能定义具体的排序规则名称,也就是排序规则名称都是字符集对应的默认排序规则名称。 这点从以上例子就可以看出来。

5. collate 子句

collate 语句强制指定排序规则,优先级最高。也就是显式指定collate 会覆盖已有的排序规则。

这里涉及到单个字符串以及字符串拼接的排序规则问题。

显式的指定排序方式

-- 示例表 c1,
mysql> create table c1 (n char(1));
Query OK, 0 rows affected (0.06 sec)

-- 插入示例数据,英文大小写字母乱序插入
mysql> insert into c1 with recursive a(x,y) as 
(
   select 65,97 uNIOn all select x+1,y+1 from a where x<90
) 
select char(x using ascii) x from a 
union all 
select char(y using ascii) y from a order by rand();

Query OK, 52 rows affected (0.02 sec)
Records: 52  Duplicates: 0  Warnings: 0

改变 order by 的排序规则。

-- 原有排序结果
mysql> select n from c1 order by n  desc limit 6;
+------+
| n    |
+------+
| Z    |
| z    |
| y    |
| Y    |
| x    |
| X    |
+------+
6 rows in set (0.00 sec)

-- collate 显式指定后,排序结果。
mysql> select n from c1 order by n  collate utf8mb4_0900_bin desc limit 6;
+------+
| n    |
+------+
| z    |
| y    |
| x    |
| w    |
| v    |
| u    |
+------+
6 rows in set (0.00 sec)

用于具体的列别名

mysql> select n collate utf8mb4_bin as n from c1 order by n  desc limit 6;
+------+
| n    |
+------+
| z    |
| y    |
| x    |
| w    |
| v    |
| u    |
+------+
6 rows in set (0.01 sec)

用于聚合函数

mysql> select max(n) n from c1;
+------+
| n    |
+------+
| Z    |
+------+
1 row in set (0.00 sec)

-- 强制collate结果
mysql> select max(n collate utf8mb4_bin) n from c1;
+------+
| n    |
+------+
| z    |
+------+
1 row in set (0.00 sec)

或者用于 where,group by,having 等等。

用于统计排序方式的强制性指标

比如要在 where 条件里过滤字符串,where a = "a",那此时是用 a 的排序规则,还是字符 "a" 的排序规则,这里就涉及到一个排序规则的强制性指标

MySQL 的排序规则强制性指标值 从 0 到 6 一共 7 个。数字指标越小,优先级越高。以下为指标值说明:

说明
0 显式指定 collate 语句,最高优先级
1 两个不同排序规则的字符串拼接,此时指标为 1
2 两个不同的列、存储过程参数或者本地变量的指标为 2
3 系统常量的指标为 3。比如 user(),version() 等函数
4 简单的字符串文字,指标为 4
5 数字或者日期等指标为 5
6 NULL 或者包含 NULL 的表达式或者结果为 NULL 的指标都为 6

同时,为了便于大家理解,MySQL 提供了如何检测这个指标的函数 coercibility,举几个例子看下:

示例:

-- collate 字句指标为 0
mysql> select coercibility("a" collate utf8mb4_bin) as "coercibility";
+--------------+
| coercibility |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

-- 简单的文本指标为 4
mysql> select coercibility("a") as "coercibility";
+--------------+
| coercibility |
+--------------+
|            4 |
+--------------+
1 row in set (0.00 sec)

-- 日期指标为 5
mysql> select coercibility(now()) as "coercibility";
+--------------+
| coercibility |
+--------------+
|            5 |
+--------------+
1 row in set (0.00 sec)

-- 系统常量指标为 3
mysql> select coercibility(@@server_uuid) as "coercibility";
+--------------+
| coercibility |
+--------------+
|            3 |
+--------------+
1 row in set (0.00 sec)

总结

对于字符集的控制相关 SQL 就介绍的差不多了。主要举例介绍了 MySQL 字符集相关的处理 SQL 语句,比如设置客户端相关编码语句:SET NAMES/SET CHARSET;设置排序规则语句:COLLATE;给 MySQL 信号的 introducer 等。希望对大家有帮助。


关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

您可能感兴趣的文档:

--结束END--

本文标题: 第07期:有关 MySQL 字符集的 SQL 语句

本文链接: https://www.lsjlt.com/news/6859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql中表示一个字符的语句
    在 sql 中,使用单引号 (') 表示单个字符,语法为 '[字符]。' 字符字面值必须用单引号引起来,只能包含一个字符。特殊字符可以使用转义字符 (') 表示。 SQL 中表示一个字...
    99+
    2024-05-02
  • sql语句中drop关键字功能有哪些
    这篇文章主要介绍sql语句中drop关键字功能有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sql语句中的drop关键字的功能是:从数据库中删除表。drop语句将删除表的结构,...
    99+
    2024-04-02
  • 怎么在MySQL中使用sql语句截取字符串
    这篇文章将为大家详细讲解有关怎么在MySQL中使用sql语句截取字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、left(name,4)截取左边的4...
    99+
    2024-04-02
  • MySQL特有的SQL语句介绍
    本篇内容介绍了“MySQL特有的SQL语句介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!create语...
    99+
    2024-04-02
  • PHP转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
    ...
    99+
    2024-04-02
  • SqlServer 获取字符串中小写字母的sql语句
    有时候我们会截取字符串中的一些特殊想要的东西,大小写字母、模号、汉字、数字等等,今天先介绍一个获取字符串中小写字母(也是大写字母)的方式,直接上写法: DECLARE @s VARCHAR(MA...
    99+
    2024-04-02
  • mysql sql语句将查出来的每列变为字符串类型
    在MySQL中,可以使用CAST()函数或CONVERT()函数将查出来的每列数据转换为字符串类型。具体用法如下: 使用CAST()函数: SELECT CAST(column_name AS CHAR) AS new_column...
    99+
    2023-08-25
    mysql 数据库
  • sqlserver中获取字符串中汉字的个数的sql语句
    本篇内容主要讲解“sqlserver中获取字符串中汉字的个数的sql语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlserver中获取字符串中汉字的个数...
    99+
    2024-04-02
  • MySQL字符集对SQL注入攻击有什么影响
    MySQL字符集对SQL注入攻击有一定影响,具体如下: 使用不同字符集可以减少SQL注入攻击的成功率,因为不同字符集对特殊字符的...
    99+
    2024-04-02
  • sql无效字符执行sql语句报错的解决方法
    本篇文章为大家展示了sql无效字符执行sql语句报错的解决方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。说起来惭愧,总是犯一些小错误,纠结半天,这不应为一个分号...
    99+
    2024-04-02
  • mysql 的增删改查以及模糊查询、字符集语句的使用
    一、mysql启动与登陆(windows下的mysql操作) 1.启动mysql服务 net  start mysql81 2.登陆mysql mysql -uroot -p 3.查看所有数据库 show databa...
    99+
    2023-09-18
    mysql 数据库
  • MySQL中有哪些常用的SQL语句
    MySQL中有哪些常用的SQL语句,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、复杂SQL查询1.1、单表查询(1)选择指定的列[例]查询...
    99+
    2024-04-02
  • mysql删除表字段的sql语句怎么写
    要删除表字段,可以使用ALTER TABLE语句,指定要删除的字段名称。以下是一个示例SQL语句: ALTER TABLE tabl...
    99+
    2024-03-05
    mysql
  • sql中表示并集的关键字有哪些
    在 sql 中,表示并集的关键字是 union,用于将多个 select 语句的结果合并为包含所有唯一行的单个结果集。 SQL 中表示并集的关键字 在 SQL 中,...
    99+
    2024-05-02
  • MYSQL常用的基本SQL语句有哪些
    这篇文章主要讲解了“MYSQL常用的基本SQL语句有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MYSQL常用的基本SQL语句有哪些”吧!mysql服...
    99+
    2024-04-02
  • MySQL的第一篇文章——了解数据库、简单的SQL语句
    目录 学习目标 第一章 介绍数据库 1. 数据库概述 2. MySQL概述 第二章 MySQL的使用 1. MySQL服务的启动 2. 客户端连接MySQL 2.1 命令行客户端 第三章 SQL的介绍 1. 什么是SQL 2. SQL的分类...
    99+
    2023-09-09
    数据库 mysql sql
  • MySQL常用的建表等SQL语句有哪些
    这篇文章将为大家详细讲解有关MySQL常用的建表等SQL语句有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。建表:DROP TABLE IF&nb...
    99+
    2024-04-02
  • MySQL数据表使用的SQL语句有哪些
    这篇文章主要讲解了“MySQL数据表使用的SQL语句有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据表使用的SQL语句有哪些”吧!EXPLAIN 语句分析SQL索引使用,关...
    99+
    2023-06-30
  • 【MySQL】如何查询MySQL执行过的所有SQL语句
    文章目录 1 MySQL 的通常查询日志实验2 参考资料 1 MySQL 的通常查询日志实验 通过 MySQL 的通用查询日志可以找到你指定的每一条 sql 语句。很明显会有严重的性能损耗...
    99+
    2023-09-22
    mysql 数据库
  • SQL语句中的字符串函数、时间函数是什么
    本篇文章给大家分享的是有关SQL语句中的字符串函数、时间函数是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。字符串函数1.大小写转换&nb...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作