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

b3568eaecc812e280a97bc03c90928f5.png

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

一、character introducer

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

语法很简单:

[_charset_name] 'string' [COLLATE collation_name]

示例:

字符串"北京加油❤!"

-- 字符集 utf8mb4,排序规则 utf8mb4_binselect _utf8mb4 "北京加油❤!" collate utf8mb4_bin as result;+------------------+| result           |+------------------+| 北京加油❤!       |+------------------+1 row in set (0.00 sec)-- 字符集 utf8mb4,collate 字句缺失,此时对应排序规则为utf8mb4_w0900_ai_ciselect _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 使用规则:

68145be0e888dabee69f89abb0c7aade.png

二、字符集转换函数

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)

2)只用来设置字符集,不能定义具体的排序规则名称,也就是排序规则名称都是字符集对应的默认排序规则名称。这点从以上例子就可以看出来。

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 aunion allselect 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 个。数字指标越小,优先级越高。以下为指标值说明:

813c4da94b517afaba825985eda7bf40.png

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

示例:

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

总结

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


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

3e71cc8ebcb436d051ffc60c082d205c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言main函数的参数argc,argv说明

main函数参数argc&#xff0c;argv说明 C/C语言中的main函数&#xff0c;经常带有参数argc&#xff0c;argv&#xff0c;如下&#xff1a; int main(int argc, char** argv) int main(int argc, char* argv[]) 这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔)…

怎么调整计算机显示屏,电脑显示器怎样调大屏幕

电脑显示器怎样调大屏幕你们知道怎么调整电脑显示器的屏幕吗?下面是应届毕业生小编带来的关于电脑显示器怎样调大屏幕的内容&#xff0c;欢迎阅读!电脑显示器怎样调大屏幕?以前的xp系统是在桌面点击右键然后选择属性&#xff0c;在属性里设置分辨率的。而win7则有点不同&…

使用jstat报告自定义JVM指标集

我一直缺少在JStat中配置自定义标头的可能性 。 当然&#xff0c;有很多预定义的数据集&#xff0c;但是如果我们可以创建自己的数据集&#xff0c;那就更好了。 正如您可能已经设计的那样&#xff0c;我正在写这篇文章&#xff0c;因为这样的功能当然可用&#xff1a;)不幸的是…

XP退役对整个互联网安全的问题

如果你的电脑还是XP&#xff0c;那么请你看看我写的内容吧。 4月8好微软结束支持之后依然可以运行XP和office2003&#xff0c;但是会带来潜在风险&#xff0c;首先为安全性和合规性分析&#xff0c;比如黑客攻击&#xff1b;其次为缺少软硬件支持&#xff0c;许多电脑硬件和…

python在线教育平台项目面试_【松勤软件自动化测试】selenium+python面试题目总结...

1. WebDriver原理webDriver是按照client/server模式设计&#xff0c;client就是我们的测试代码&#xff0c;发送请求&#xff0c;server就是打开的浏览器来打开client发出的请求并做出响应。具体的工作流程&#xff1a;webdriver打开浏览器并绑定到指定端口。启动的浏览器作为r…

win7打开计算机死机,win7系统进入桌面总是死机或者卡死怎么办

??最近有位深度技术win7旗舰版用户的电脑总是在进入桌面的时候莫名其妙的死机或者卡死&#xff0c;遇到这种情况我们应该怎么办呢&#xff1f;我们可以通重启资源管理器来解决屏幕卡死的问题&#xff0c;首先我们要打开任务管理器&#xff0c;下面由小编来跟大家介绍一下win7…

二级计算机excel以宏保存,Excel宏保存

2 个答案:答案 0 :(得分&#xff1a;3)像这样 -Sub SaveSheet()Dim wbkDashboard As WorkbookDim wsTarget As WorksheetSet wsTarget Thisworkbook.worksheets("Sheet1")Dim strFileName As StringstrFileName wsTarget.Range("B8").Value _& Forma…

以太网例程_开关量转以太网的应用

由于工业以太网的快速冗余自愈能力以及实时性方面问题的逐步解决&#xff0c;工业以太网技术正在逐步深入至工业控制网络的现场设备层应用&#xff0c;即直接基于工业以太网通信来控制现场设备的运行&#xff0c;利用开关量控制模块提供的以太网转开关量功能&#xff0c;计算机…

hbase+hive应用场景

一.Hive应用场景本文主要讲述使用 Hive 的实践&#xff0c;业务不是关键&#xff0c;简要介绍业务场景&#xff0c;本次的任务是对搜索日志数据进行统计分析。集团搜索刚上线不久&#xff0c;日志量并不大 。这些日志分布在 5 台前端机&#xff0c;按小时保存&#xff0c;并以小…

CPU缓存越大计算机的性能越好,CPU缓存真的越大越好?小心你的钱包

除了内存和硬盘&#xff0c;电脑还有一种超快速的存储设备&#xff0c;就是CPU缓存当你想到你电脑当中的存储设备时&#xff0c;你可能想到的是DDR内存、显卡上的显存、或者更有可能只是机械硬盘和SSD。但其实还有一种超快速的存储设备&#xff0c;对我们习以为常的、现代电脑的…

rostcm6情感分析案例分析_电商评论情感分析

并可以实现云图的可视化.7.2 R的实现这里需要安装几个必须包&#xff0c;因为有几个包安装比较复杂&#xff0c;这里给了链接http&#xff1a;//blog.csdn.net/cl1143015 ... 82731大家可以参看这个博客安装包.安装完成后就可以开始R文本挖掘了&#xff0c;下面代码说明性文字比…

JavaScript之substring()方法讲解

定义和用法 substring() 方法用于提取字符串中介于两个指定下标之间的字符。 语法 stringObject.substring(start,stop) 参数描述start必需。一个非负的整数&#xff0c;规定要提取的子串的第一个字符在 stringObject 中的位置。stop 可选。一个非负的整数&#xff0c;比要提取…

jvm 参数-server_JVM选项:-client vs -server

jvm 参数-server您是否曾经在运行Java应用程序时想知道-client或-server开关是什么&#xff1f; 例如&#xff1a; javaw.exe -client com.blogspot.sdoulger.LoopTest也显示在java.exe的“帮助”中&#xff0c;例如&#xff0c;其中的选项包括&#xff1a; -client选择“客户…

小米3显示sim卡无服务器,小米手机无服务怎么解决

原标题&#xff1a;小米手机无服务怎么解决方法一&#xff1a;1.第一步是检查电话卡是否正确插入卡槽中。这种情况也会发生很长时间。如果未正确插入卡插槽&#xff0c;则将导致无法维修。2.要注意的第二件事是&#xff0c;如果所购买的小米手机是电信版的&#xff0c;那么插入…

python消息订阅_python rabbitmq消息发布订阅

发送端&#xff1a;import pikaimport sysconnection pika.BlockingConnection(pika.ConnectionParameters(hostlocalhost))channel connection.channel()channel.exchange_declare(exchangelogs,exchange_typefanout)message .join(sys.argv[1:]) or "info: Hello Wo…

使用before、after伪类制作三角形

使用before、after伪类实现三角形的制作&#xff0c;不需要再为三角形增加不必要的DOM元素&#xff0c;影响阅读。 <!DOCTYPE html><html><head> <style> div{ width: 100px; height: 100px; border: 1px …

EJB的超时策略:它们如何提供帮助?

EJB 3.1在其API中引入了与超时相关的注释。 AccessTimeout StatefulTimeout 让我们快速看一下它们是什么以及它们为什么重要 AccessTimeout 指定一个排队请求&#xff08;等待另一个线程完成&#xff09;超时的时间段。 当您的会话bean实例被并发请求轰炸时&#xff0c;EJ…

cad服务器手动改自动,几百块就能手动改自动? 怎样省钱换来方便

现在市场上可以手动改自动挡是真的吗?今日市场上出现的手动挡升级自动挡的技术&#xff0c;不少网友询问这个手动挡改自动挡技术&#xff0c;手动改自动挡真的吗?记者带着疑问进行各方面搜索和调查。经过调查&#xff0c;记者终于了解到市场上真的有这种技术&#xff0c;可以…

Windows Phone性能优化建议

Windows Phone性能优化建议 原文:Windows Phone性能优化建议使用background thread解码图片在Windows Phone中支持的图片格式有jpg和png&#xff0c;微软建议使用png格式的图片&#xff0c;因为png格式的图片在解码速度上要比jpg快。那么我们怎么来控制用后台线程来解码图片呢&…

opencv检测相交点_OpenCV特征点检测------ORB特征

ORB是是ORiented Brief的简称。ORB的描述在下面文章中&#xff1a;Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski, ORB: an efcient alternative to SIFT or SURF, ICCV 2011没有加上链接是因为作者确实还没有放出论文&#xff0c;不过OpenCV2.3RC中已经…