mysql的英文字母_MySQL中查询的有关英文字母大小写问题的分析

mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的。

1. 什么是字符集和校验规则?

字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。任何一个给定的字符集至少有一个校对规则,它可能有几个校对规则。要想列出一个字符集的校对规则,使用SHOW COLLATION语句。

0e4a6a7c90977e352e35f29a7bfeafa4.png

校对规则一般有这些特征:

两个不同的字符集不能有相同的校对规则。

每个字符集有一个默认校对规则。例如,utf8默认校对规则是utf8_general_ci。

存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。

2. 不同级别的字符集和校验规则可控制大小写敏感

MySQL5.1在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合定义字符串。字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。

2.1服务器级

MySQL按照如下方法确定服务器字符集和服务器校对规则:

(1)修改配置文件/etc/my.cnf

在[mysqld]下添加:collation_server = utf8_bin

重启实例

8b698f0c93a117f039a34de1bd2d3e5e.png

更改服务器级的校验规则(collation_server )后,数据库校验规则(collation_collation)默认会继承服务器级的。

注意:

这个只适用于在重新启动之后, 新建的库,已存在的库不受影响.

同样的, 即使库的校验规则改了,已经存在的表不受修改影响;

同理与已经存在的列... mysql> create database yutest0;

Query OK, 1 row affected (0.00 sec)

mysql> use yutest0;

Database changed

mysql> create table t1 (name varchar(10));

Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('AAA');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values('aaa');

Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;

+------+

| name |

+------+

| AAA |

| aaa |

+------+

2 rows in set (0.00 sec)

mysql> select * from t1 where name='aaa';

+------+

| name |

+------+

| aaa |

+------+

1 row in set (0.00 sec)

可以看出,在服务器级进行相应的校对规则设置,查询大小写敏感。

(2)当服务器启动时根据有效的选项设置

当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和校对规则。

shell> mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci

2.2数据库级

MySQL这样选择数据库字符集和数据库校对规则:

如果指定了character set X和collate Y,那么采用字符集X和校对规则Y。

如果指定了character set X而没有指定collate Y,那么采用character set X和character set X的默认校对规则。

否则,采用服务器字符集和服务器校对规则。

(1)修改配置文件/etc/my.cnf

进行了两组测试:

1) 在[mysqld]下添加: collation_server = utf8_bin

collation_database = utf8_bin

2) 在[mysqld]下添加: collation_database = utf8_bin

重启实例,两组都不能正常启动,错误信息如下:

23c86e7303e7a71a80399c4918742e58.png

可见,my.cnf配置文件中不支持设置collation_database 变量。

(2)创建数据库时设置数据库校验规则 mysql> create database yutest default character set utf8 collate utf8_bin;

Query OK, 1 row affected (0.00 sec)

mysql> show variables like 'collation_%';

+----------------------+-----------------+

| Variable_name | Value |

+----------------------+-----------------+

| collation_connection | utf8_general_ci |

| collation_database | utf8_bin |

| collation_server | utf8_general_ci |

+----------------------+-----------------+

3 rows in set (0.00 sec)

mysql> select * from t1;

+------+

| name |

+------+

| ABC |

| abc |

+------+

2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';

+------+

| name |

+------+

| abc |

+------+

1 row in set (0.01 sec)

可以看出,在数据库级进行相应的校对规则设置,查询大小写敏感。

2.3表级

MySQL按照下面的方式选择表字符集和校对规则:

如果指定了character set X和collate Y,那么采用character set X和collate Y。

如果指定了character set X而没有指定collate Y,那么采用character set X和character set X的默认校对规则。

否则,采用数据库字符集和服务器校对规则。

在创建表时设置表级校验规则: mysql> create database yutest2;

Query OK, 1 row affected (0.01 sec)

mysql> use yutest2;

Database changed

mysql> create table t1(name varchar(10))

-> default character set utf8 collate utf8_bin;

Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values('ABC');

Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values('abc');

Query OK, 1 row affected (0.00 sec)

mysql> show variables like 'collation_%';

+----------------------+-----------------+

| Variable_name | Value |

+----------------------+-----------------+

| collation_connection | utf8_general_ci |

| collation_database | utf8_general_ci |

| collation_server | utf8_general_ci |

+----------------------+-----------------+

3 rows in set (0.00 sec)

mysql> select * from t1;

+------+

| name |

+------+

| ABC |

| abc |

+------+

2 rows in set (0.00 sec)

mysql> select * from t1 where name='abc';

+------+

| name |

+------+

| abc |

+------+

1 row in set (0.00 sec)

可以看出,在表级进行相应的校对规则设置,查询大小写敏感。

2.4 连接级

考虑什么是一个“连接”:它是连接服务器时所作的事情。客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。对于客户端连接,这样会导致一些关于连接的字符集和校对规则的问题,这些问题均能够通过系统变量来解决: mysql> show variables like 'character%';

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)

当查询离开客户端后,在查询中使用哪种字符集?

服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

服务器接收到查询后应该转换为哪种字符集?

转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection。

服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?

character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

3. 创建数据库表时大小写不敏感,仍然有方法在查询时区分大小写

3.1 在SQL语句中使用collate

使用collate子句,能够为一个比较覆盖任何默认校对规则。collate可以用于多种SQL语句中,比如where,having,group by,order by,as,聚合函数。 mysql> select * from t1 where name collate utf8_bin = 'ABC';

+------+

| name |

+------+

| ABC |

+------+

1 row in set (0.00 sec)

mysql> select * from t1 where name = 'ABC';

+------+

| name |

+------+

| ABC |

| Abc |

| abc |

+------+

3 rows in set (0.00 sec)

mysql> select * from t1;

+------+

| name |

+------+

| ABC |

| Abc |

| abc |

+------+

3 rows in set (0.00 sec)

3.2 binary操作符

binary操作符是collate子句的一个速记符。binary 'x'等价与'x' collate y,这里y是字符集'x'二元校对规则的名字。每一个字符集有一个二元校对规则。例如,latin1字符集的二元校对规则是latin1_bin,因此,如果列a是字符集latin1,以下两个语句有相同效果: select * from t1 order by binary a;

select * from t1 order by a collate latin1_bin;

mysql> select * from t1 where binary name = 'ABC';

+------+

| name |

+------+

| ABC |

+------+

1 row in set (0.00 sec)

mysql>

mysql> select * from t1 where name = 'ABC';

+------+

| name |

+------+

| ABC |

| Abc |

| abc |

+------+

3 rows in set (0.00 sec)

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

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

相关文章

JDK8 lambda的会话指南–术语表

上次出现…我写了一篇与JDK8为我们提供的新方法有关的文章。 最令我兴奋的功能是lambda。 我必须承认,在即将成为浪子的第一年(在此期间,我使用C#开发了该产品),我喜欢LINQ和它可以做的漂亮,优雅…

写接口给别人调用 推送数据到我们_我们写了一个超好用的抖音矩阵数据管理工具...

我最近跑了十来个抖音号,遇到一些问题,然后通过我们NB的程序员解决了。如果你也在做抖音矩阵,那这些问题你肯定也会遇到,所以我把解决问题的方法工具化了,给大家用。我遇到的最大的问题,就是账号数据的同步…

php crypt mysql password_使用PHP 5.5的password_hash和password_verify函数

使用PHP 5.5的password_hash和password_verify函数假设我想为用户存储密码,这是使用PHP 5.5的password_hash()功能(或者这个版本的PHP 5.3.7:https://github.com/ircmaxell/password_compat)的正确方法吗?$options array("c…

Mysql order by 导致 using filesorting

https://www.cnblogs.com/drcoding/p/4942277.html转载于:https://www.cnblogs.com/eason-d/p/9700526.html

angular 拼接html 事件无效

主要是要引用$compile方法 更多专业前端知识,请上 【猿2048】www.mk2048.com

更好地利用Pmd,Findbugs和CheckStyle的结果。

我们可以列举许多Java静态分析工具,每种工具都专注于特定领域并具有其优势,我们可以列举一下: Pmd是基于静态规则集的Java源代码分析器,它识别潜在的问题,例如: 可能的错误-空的try / catch / finally / s…

Java基础知识(数据类型和集合)

一、数据类型 包装类型 包装类型是对基本数据类型不足之处的补充。 基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法。 Java1.5 以后可以自动装箱和拆箱 二、集合 List:有序、可重复。可以通过索引…

python 局域网 主机名_使用python获取连接到本地网络(基于主机名)的所有设备的ip...

这绝对不是重复的。在我正在做一个应用程序,我需要找到我的设备的IP地址。我知道他们的名字,通过他们的名字我需要得到他们的知识产权。Linux应该很简单,但我需要跨平台的态度,因此我使用python。在我已经知道解决方案&#xff1a…

mfc使用cef源代码实现_如何获得微信小游戏跳一跳源码以及源代码组合包括哪些...

很多小游戏都是由源代码编写而成的,那大家知道源代码组合包括哪些吗?手机游戏源代码怎么使用的呢?还有,如何获得微信小游戏跳一跳源码?下面就由奇瑰网小编带大家来了解一下相关的内容吧。   源代码组合包括哪些   源代码作为软件的特殊部分&#…

js 分页插件(jQuery)

参考:http://www.jb51.net/article/117191.htm 侵删 css 部分 charset "utf8"; *{box-sizing: border-box;padding: 0;margin: 0; } .page{font-size: 13px;text-align: center;margin-top: 20px; } .page .page_to{display: inline-block;max-width: 25…

机器学习过程中欠拟合和过拟合的诊断及解决方法

1.Diagnosing bias vs. variance 2.Regularization and bias/variance 3.Learning curves 4.Deciding what to try next 转载于:https://www.cnblogs.com/CoolJayson/p/9704385.html

微信 python 2020_2020年最新的Python操控微信教程

​自从微信禁止网页版登陆之后,itchat 库实现的功能也就都不能用了,那现在 Python 还能操作微信吗?答案是还可以。目前有一个项目 WechatPCAPI 可以对微信进行操作,简单来说它是直接操作 PC 版微信客户端的,当然它有一…

高级Java泛型:检索泛型类型参数

在JDK5中引入Java泛型之后, Java泛型Swift成为许多Java程序的组成部分。 但是,乍一看似乎很简单的Java泛型,程序员很快就会迷失此功能。 大多数Java程序员都知道Java编译器的类型擦除 。 一般来说,类型擦除意味着有关Java类的所有…

php 算法

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找&#xff08;数组里查找某个元素&#xff09; function bin_sch($array, $low, $high, $k){ if ( $low < $high){ $mid intval(($low$high)/2 ); if…

python利用opencv去除图片logo_利用python和opencv批量去掉图片黑边

import osimport cv2import numpy as npfrom scipy.stats import modeimport timeimport concurrent.futures‘‘‘multi-process to crop pictures.‘‘‘def crop(file_path_list):origin_path, save_path file_path_listimg cv2.imread(origin_path)gray cv2.cvtColor(im…

angularJS解决数据显示闪一下的问题?-解决办法

转自&#xff1a;https://www.cnblogs.com/e0yu/p/7219930.html?utm_sourceitdadao&utm_mediumreferral#undefined 使用 angular JS 的时候&#xff0c;把 angularJS 放到文件底部&#xff0c;在渲染页面的时候&#xff0c;会出现闪一下的情况&#xff1a; 解决办法一&a…

vue的钩子函数

1.computed 计算属性 计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 1..aPlus: {get: function () {return this.a 1},set: function (v) {this.a v - 1}}2.. aPlus(){    return this.$router.params  } 这两种方法都可以&am…

python英文字符串排序_Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)...

标签&#xff1a;import rere_digits re.compile(r‘(\d)‘)def embedded_numbers(s):pieces re_digits.split(s) # 切成数字与非数字pieces[1::2] map(int, pieces[1::2]) # 将数字部分转成整数return piecesdef sort_strings_with_embedded_numbers(ali…

定时运行python脚本并发送邮件_python实现定时发送邮件到指定邮箱

本文实例为大家分享了python实现定时发送邮件到指定邮箱的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下整个链路&#xff1a;传感器采集端采集数据&#xff0c;边缘端上传数据库&#xff0c;从数据库拿到数据。产品端有个自动出报告的需求&#xff0c;并且希望自动…

使用Guava的AbstractInvocationHandler正确完成代理

不太经常&#xff0c;但有时我们被迫使用java.lang.reflect.Proxy编写自定义动态代理类 。 这种机制的确没有魔力&#xff0c;而且即使您永远不会真正使用它&#xff0c;也值得知道-因为Java代理在各种框架和库中无处不在。 这个想法很简单&#xff1a;动态创建一个实现一个或…