网站备案号格式说明书,深圳电子商务网站制作,平台借钱哪个利息最低,wordpress标签分页本篇为理清字符集的续篇(上一篇#xff1a;第06期#xff1a;梳理 MySQL 字符集的相关概念)#xff0c;重点讲述字符集涉及到的 sql 语句用法。一、character introducer翻译过来就是字符引导。也就是针对字符串#xff0c;显式的给定一个字符编码和排序规则#xff0c;不…本篇为理清字符集的续篇(上一篇第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_connectionlatin1;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 cant be set to the value of utf324. set character set 语句语法为SET {CHARACTER SET | CHARSET}{charset_name | DEFAULT}类似语句 set names同样是设置以下三个 session 参数character_set_resultscharacter_set_clientcharacter_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 x1,y1 from a where x90)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)或者用于 wheregroup byhaving 等等。用于统计排序方式的强制性指标比如要在 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 的技术内容你们还有什么想知道的吗赶紧留言告诉小编吧