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

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

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

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

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

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

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

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

2.1服务器级

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

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

在[mysqld]下添加:collation_server = utf8_bin

重启实例

更改服务器级的校验规则(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

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

可见,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)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
mysql 字母大小写、mysql判断字母大小写、mysql查询区分大小写、mysql忽略大小写查询、mysql查询大小写敏感,以便于您获取更多的相关知识。

时间: 2024-11-26 03:58:24

MySQL中查询的有关英文字母大小写问题的分析_Mysql的相关文章

WPS Office 2012中更改英文字母大小写

WPS Office 2012有许多很不错的功能,今天就说一下如何用WPS 2012更改英文字母大小写. 第一步:选中文字,单 击激活标题后面的"开始"标签,单击字体工具区域中的更改大小写图标,弹出"更改大小写"对话框,选择"小写"完成第一 步. 图 1 图 2 第二步:英文每句话的第一个字母必须大写,所以我们在全选状态下执行"句首字母大写"操作. 第三步:英 文专有名词中实词的第一个字母必须大写,我们选中相应单词后执行&qu

javascript英文字母大小写转换详解

toLocaleUpperCase 将字符串中所有的字母字符都将被转换为大写的,同时适应宿主环境的当前区域设置. toUpperCase 将字符串中的所有字母都被转化为大写字母.  代码如下 复制代码 <script type="text/javascript"> var str="hello world!" document.write(str.toUpperCase()) </script> 结果 HELLO WORLD! toLocal

在word2007文档中如何批量删除英文字母?

  在word2007文档中如何批量删除英文字母?          步骤 1.点击office word2007 功能按钮图标,进入word编辑主界面中 2.在编辑界面中,看到相应的内容,然后 点击工具栏上的开始按钮,点击替换按钮 3.在弹出的查找和替换这个输入框中,点击更多选项按钮 4.在弹出的更多选项界面中,点击特殊格式按钮 5.在弹出的特殊字符界面中,找到任意字母这个选项,点击该选项 6.在查找内容这个字段中,出现任意字母的查找表达式 7.最后点击下全部替换这个按钮,就能将所有的英文字母

select-关于mysql中查询重复数据的疑问

问题描述 关于mysql中查询重复数据的疑问 我有一个表叫做sc. 现在要查询score中有相同分数的信息, 查询的sql语句是 select * from sc where score in (select score from sc group by score having count(score)>1); 我很好奇的是group by的执行顺序是比 having先执行啊, 按道理,执行了之后重复的score值是没有的,怎么还能再用having 来查出count(score)>1 的重复

mysql-JSP怎么获取在MySql中查询到的数据中的指定值?

问题描述 JSP怎么获取在MySql中查询到的数据中的指定值? 这是我的table结构,一共6列,主键是id,table名是user,现在想通过查找username来获取指定username的name值,并存入session中,用SELECT * FROM user where 语句可以获取一行值,如果我只要取name列的值,代码应该怎么写呢?比如我想取username为zeng的用户的name值,应当怎么写?之前遇到个问题卡了很久,提问求个例子之后大家都只说个大概思路,无奈只好把问题拆分开来问

php-PHP无法在MySQL中查询中文数据

问题描述 PHP无法在MySQL中查询中文数据 跪求大神来回答!我的PHP脚本已经实现了MySQL数据库的链接.但是发现在HTML页面上输入中文查询,显示的是数据库中没有这个信息. 但其实我的MySQL里面有这条中文数据的.网上说的设置utf8,gbkgb2312我都试过了,也没有用. 我的并不是说页面显示中文乱码,而是数据库中无法执行查询中文这一操作.希望大神能帮个忙! 解决方案 $inputData = iconv(""GB2312""UTF-8"&q

hql在mysql中查询出错

问题描述 hql在mysql中查询出错 今天遇到一个非常奇怪的问题,mysql数据库,hibernate注解配置表, from Wxyhdtb where zt=1 and wxyh.id=1 order by wxyh.id 测试发现在where条件中wxyh.id会出错,Unknown column 'wxyh.id' in 'where clause',但是只在order by wxyh.id却没有问题 ,请问这是什么情况? 注:以前用oracle 就不会出现这种情况 解决方案 Mysql

入门php在mysql中查询数据

问题描述 入门php在mysql中查询数据 数据库中有张表有主键pmcode还有其他属性,我现在想通过pmcode判断某个用户是否存在,存在的话将其信息取出,代码如下: //拆分发来的信息得到会员卡号 $arry=explode("+",$form_Content); $memberid =$arry[1]; //连接数据库 $link=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_

js正则英文字母大小写转换例子

一.将英文字母转换成小写  代码如下 复制代码 function manualLowercase(s) {     s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}); } 二.将英文字母转换成大写  代码如下 复制代码 function manualUppercase(s) {     s.replace(/[a-z]/g, function(ch) {return Str