字符集_第07期:有关 MySQL 字符集的 SQL 语句
本篇为理清字符集的续篇(上一篇:第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 使用规则:
二、字符集转换函数
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 个。数字指标越小,优先级越高。以下为指标值说明:
同时,为了便于大家理解,MySQL 提供了如何检测这个指标的函数 coercibility,举几个例子看下:
示例:
SET NAMES {'charset_name'[COLLATE 'collation_name'] | DEFAULT}
总结
对于字符集的控制相关 SQL 就介绍的差不多了。主要举例介绍了 MySQL 字符集相关的处理 SQL 语句,比如设置客户端相关编码语句:SET NAMES/SET CHARSET;设置排序规则语句:COLLATE;给 MySQL 信号的 introducer 等。希望对大家有帮助。
关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!
字符集_第07期:有关 MySQL 字符集的 SQL 语句相关推荐
- 易语言执行mysql命令行_易语言教程之MySQL[3]执行SQL语句
连接MySQL服务器后,接着就可以做点实际的操作了,比如读取记录,插入记录,修改记录等.操作MySQL有2种方法,本集讲的是第一种,适合懂MySQL语句的人,方便,学习成本低,效率高.但不懂MySQL ...
- sql操作mysql数据库_一些常用的操作MySQL数据库的sql语句
创建数据库:create database 数据库名; 删除数据库:drop datebase 数据库名; 查看数据库:show databases;(所有数据库) 使用数据库:use 数据库名;(之 ...
- 1.MySQL数据库 2.SQL语句
01数据库概念 * A: 什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. * B: 什么是数据库 ...
- MySQL 简介及SQL 语句
MySQL 简介及SQL 语句 一.数据库概述 1.数据库的分类 1)区别 2.MySQL 概述 3.MySQL 存储原理 二.部署 MySQL 数据库 1.安装 MySQL 数据库 2.优化调整 M ...
- MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率
目录 一. 前文简介 二. MYSQL简介 2.1 什么是数据库 2.2数据库地特点以及作用 三.MYSQL基础操作(SQL语句) 3.1连接数据库 3.2数据库的语法特点,以及数据库必会操作 数据操 ...
- MySQL数据库:SQL语句
MySql数据库系列阅读 MySQL数据库 MySQL数据库:SQL语句 MySQL数据库:完整性约束 MySQL数据库备份与还原 MySQL数据库:编码 1. SQL概述 1.1 什么是SQL SQ ...
- mysql中利用sql语句修改字段名称,字段长度等操作(亲测)
在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的m ...
- php 登陆 sql语句,PHP 连接MySQL数据库的SQL语句的简单示例
这篇文章主要为大家详细介绍了PHP 连接MySQL数据库的SQL语句的简单示例,具有一定的参考价值,可以用来参考一下. 首先用phpmyadmin进入建立数据库user 再建个三段的表admin 再别 ...
- mysql 执行顺序 SQL语句执行顺序分析
最近在做一个数据库的大作业,算是复习了下MySql里面比较复杂的一些语句的用法,如Left Join之类的.在这里就不对具体语法进行记录了,希望能在以后经常用到,而不是隔好长时间用一次.在这里就记录下 ...
最新文章
- 揭露Windows中各种不老实的服务
- 《那些年啊,那些事——一个程序员的奋斗史》——38
- mysql关联查询去重_MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)...
- tableview下拉刷新
- sql连接远程服务器索引超出了_手机怎么连接服务器远程桌面?RD client远程桌面使用教程...
- nls_lang.sh: 114: [[: not found
- Python文档阅读笔记-OpenCV中Match Shapes
- 感知哈希算法(Perceptual hash algorithm)的OpenCV实现
- 软件需求和问题解决-转载
- Ant编译SWF、SWC例子脚本
- 797. 差分(有图解)
- 【渝粤教育】国家开放大学2018年春季 7385-21T公共关系学(本) 参考试题
- markdown:轻松转成html 并加载本地图片
- bash给脚本加进度条_shell脚本进度条。
- 数学建模国赛LaTex模板讲解(Slager模板)
- 别让CDN的回源把你的服务器拖垮,采用正确的回源策略
- if_attact中几个宏定义
- Linux 文件锁的原理、实现和应用
- 电商数据分析指标体系
- 关于登录PL/SQL时出现的错误:error while tring to retrieve text for error ORA-12541
热门文章
- 天地一体化信息网络发展与拟态技术应用构想
- StevenBoyd--Convex optimization--1. Introduction
- linux用if语句编程序,Shell 脚本基础 - 使用 if 语句进行条件检测
- 争议?MySQL存储过程与函数,封装,体,完整详细可收藏
- 移动通信—无线波传播
- cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切
- Linux上静态库和动态库的编译和使用
- 2018软工实践第六次作业-团队选题报告
- 中国剩余定理 互质与非互质版本
- conflicting types for ‘方法名’ 的错误