17站长网

17站长网 首页 数据库 Mysql 查看内容

MySQL中大小写难题

2023-3-16 14:58| 查看: 1460 |来源: 互联网

1.MySQL大小写敏感规则MySQL中,一个库会对应一个文件夹,库里的表会则以文件的方式存放在文件夹内,所以,操作系统对大小写的敏感性决定了数据库和表的大小写敏 ...

1.MySQL大小写敏感规则

 MySQL中,一个库会对应一个文件夹,库里的表会则以文件的方式存放在文件夹内,所以,操作系统对大小写的敏感性决定了数据库和表的大小写敏感(MySQL有一个只读的系统变量lower_case_file_system,其值反映的正是当前文件系统是否区分大小写)因此:在Windows下Mysql的数据库和表名是大小写不敏感的,而在大多数类型的Unix系统中是大小写敏感的。

以下是MySQL详细的大小写区分规则:

在Linux下:

1、数据库名与表名是严格区分大小写的;

2、表的别名是严格区分大小写的;

3、列名与列的别名在所有的情况下均是忽略大小写的;

4、变量名也是严格区分大小写的;

在Windows下:

全部不区分大小写

补充:

1.MySQL中有一个系统变量:lower_case_table_names,专门用来配置是否区分据库名与表名的大小写。 如果你的系统是Windows,而你又希望mysql能够区分大小写,那么你可以在my.ini文件中,在[mysqld]一节的最后,加入如下部分:

[plain] view plain copy

#If set to 0, table names are stored as specified and comparisons are case sensitive.   

#If set to 1, table names are stored in lowercase on disk and comparisons are not case sensitive.   

#If set to 2, table names are stored as given but compared in lowercase. This option also applies to database names and table aliases.  

lower_case_table_names=0  

2.MySQL在查询字符串时是大小写不敏感的。如某字段值需要区分大小写,可在定义该字段时指定BINARY属性。

2.一种MySQL命名规范

为了避免大小写引发的问题,一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。

3.关于Hibernate/JPA数据库schema自动映射的问题

使用Hibernate/JPA的工程可以自动生成数据库的schema,由于java有着自己的类与字段命名规则,这与mysql推荐的命名规则不太相符,于是出现了follow哪一种命名规范的问题。一般来说这会由团队和DBA协商确定,使用mysql的命名规范不会出现大小写带来的问题,对于DBA来说可能也更加友好,而使用java的命名规范则对开发人员来说无疑是更加友好的,这将省去列名的映射配置,同时也方便开发人员查看数据库。如果你的项目使用了后者,你最好像上面讲到的,设置一下lower_case_table_names=0。

MySQL语句中字母大小写规则随着语句元素的不同而变化,同时还要取决于MySQL服务器主机上的操作系统。

SQL关键字与函数名

关键字和函数名不区分字母的大小写。如、abs、bin、now、version、floor等函数、SELECT、WHERE、ORDER、GROUP BY等关键字。

MySQL中大小写问题

数据库、数据表和视图的名字

在服务器主机上,MySQL数据库和数据表用底层文件系统中的目录和文件表示。因此数据库和数据表名字的默认字母大小写情况取决于服务器主机上的操作系统在文件名方面的规定。Windows文件名不区分字母的大小写,所以运行在windows主机上的MySQL服务器就不区分数据库和数据表名字的字母大小写。运行在Unix/Linux主机上的MySQL服务器区分数据库和数据表名字的大小写。

MySQL中使用一个文件来表示一个试图,所以视图也符合上述规则。

存储程序的名字

存储函数、存储过程、事件的名字不区分字母的大小写。触发器的名字要区分字母的大小写。

数据列和索引的名字

数据列和索引的名字在MySQL环境里不区分字母的大小写。实例如下:

MySQL的大小写问题 不是一个很大的问题,但是如果不了解的话,却会使用户产生迷惑 ;如下面

Sql代码

insert into t values('A');

insert into t values('a');

当第二条执行的时候,如果是主键或者有唯一性约束的话,会发生

Sql代码

Duplicate entry for XXX

更加迷惑的是下面的2条语句

Java代码

insert into t values('~');

insert into t values('y');

也会发生插入错误。

在查询的时候也会出现这样的问题

Java代码

/* 查询的结果一眼 */

select * from t where a like 'a%'

select * from t where a like 'A%'

/* 下面的查询结果也是一样 */

select * from t where a = 'y';

select * from t where a = ''~;

1.问题产生的原因

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

1、数据库名与表名是严格区分大小写的;

2、表的别名是严格区分大小写的;

3、列名与列的别名在所有的情况下均是忽略大小写的;

4、变量名也是严格区分大小写的;

MySQL在Windows下都不区分大小写。

MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,这个字符集对大小写不敏感,因此在比较过程中中文编码字符大小写转换造成了这种现象。

2.解决办法

A.表名区分大小写

在my.conf加入:

ower_case_table_names = 0

其中 0:区分大小写,1:不区分大小写

B.插入查询时区分大小写

字段值需要设置BINARY属性,即可区分大小写。

设置的方法有多种:

创建时设置:

CREATE TABLE T(

A VARCHAR(10) BINARY

);

使用alter修改:

ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;

mysql table editor中直接勾选BINARY项。

MySQL字符串大小写经常会让我们在注册网站时受困了注册名的大小写,出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,这个字符集对MySQL字符串大小写不敏感,因此在比较过程中中文编码字符大小写转换造成了这种MySQL字符串大小写的问题。

方法一:

解决方法是对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。

方法二:

如果你使用源码编译MySQL,可以编译MySQL时使用--with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了。

方法三:

可以使用 Mysql 的 locate 函数来判断。以上述问题为例,使用方法为:

SELECT * FROM table WHERE locate(field,'李') > 0;

方法四:

把您的Select语句改成这样,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可!

方法五:

如果你在Windows下使用已经编译好的MySQL,可以修改My.ini中的字符集选项。

default-character-set = gb2312

如果是自己的服务器使用win系统,方法五是最好的方法!如果是linux系统,可以使用方法二!如果不是自己的机子,可以使用方法一,这样你的用户名是严格区分大小写的!

本文最后更新于 2023-3-16 14:58,某些文章具有时效性,若有错误或已失效,请在网站留言或联系站长:17tui@17tui.com
·END·
站长网微信号:w17tui,关注站长、创业、关注互联网人 - 互联网创业者营销服务中心

免责声明:本站部分文章和图片均来自用户投稿和网络收集,旨在传播知识,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系我们及时修正或删除。谢谢!

17站长网微信二维码

始终以前瞻性的眼光聚焦站长、创业、互联网等领域,为您提供最新最全的互联网资讯,帮助站长转型升级,为互联网创业者提供更加优质的创业信息和品牌营销服务,与站长一起进步!让互联网创业者不再孤独!

扫一扫,关注站长网微信

大家都在看

    热门排行

      最近更新

        返回顶部