`
mtnt2008
  • 浏览: 369465 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MySQL大小写问题

阅读更多

 

 

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

 

insert into t values('A');

insert into t values('a');

 

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

 

Duplicate entry for XXX
 

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

 

insert into t values('~');

insert into t values('y');

 

也会发生插入错误。

 

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

 

/* 查询的结果一眼 */
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项。

 

 

 

分享到:
评论
14 楼 丁林.tb 2010-11-09  
<p>把原因分析也写了一下 </p>
<p> </p>
<p><a href="http://dinglin.iteye.com/blog/806428">http://dinglin.iteye.com/blog/806428</a></p>
<p> </p>
13 楼 mtnt2008 2010-11-08  
丁林.tb 写道
y和~相同, 是mysql编码中的一个bug

如果使用gbk编码
strings/ctype-gbk.c的第157行
strings/ctype-gb2312.c的第142行

'X',   'Y',   'Z',   '{',   '|',   '}',   'Y',   '\177',
第二个 'Y'改修改为 '~', 重新编译后就没问题了
就没问题了



研究的很深入!
12 楼 丁林.tb 2010-11-08  
y和~相同, 是mysql编码中的一个bug

如果使用gbk编码
strings/ctype-gbk.c的第157行
strings/ctype-gb2312.c的第142行

'X',   'Y',   'Z',   '{',   '|',   '}',   'Y',   '\177',
第二个 'Y'改修改为 '~', 重新编译后就没问题了
就没问题了

11 楼 david.org 2010-10-25  
whitesock 写道
并不是字符集不支持区分大小写,而是使用的collation。
ISO-8859-1(也就是latin1)默认的collation是latin1_swedish_ci, 其中的ci就是指case insensitive。
在定义某个列时如果使用BINARY属性,那么会在该列上使用对应字符集的binary collation,对于latin1字符集来说,即latin1_bin。



解释的再详细不过了. 
10 楼 keshin 2010-10-12  
进MySQL的data目录看一下就会明白,MySQL把表名直接用作文件名,于是出现在windows大小写不敏感而Unix下敏感的问题
9 楼 whitesock 2010-10-11  
并不是字符集不支持区分大小写,而是使用的collation。
ISO-8859-1(也就是latin1)默认的collation是latin1_swedish_ci, 其中的ci就是指case insensitive。
在定义某个列时如果使用BINARY属性,那么会在该列上使用对应字符集的binary collation,对于latin1字符集来说,即latin1_bin。
8 楼 blackstreet 2010-09-30  
lower_case_table_names=1
在my.cnf 文件上加上这个就行了,
liunx下mysql是区分大小写的
7 楼 sbkyv 2010-09-29  
select * from t where binary a like 'a%'
这样查找的时候可以区分大小写
6 楼 nurenok 2010-09-29  
mysql在从windows迁移到linux上的确有这个问题,当初我们没注意到,还以为hibernate的映射没有写好
5 楼 mimang2007110 2010-09-29  
MySQL数据库也用了很久,但是还真没有注意这个问题,感谢LZ了。
4 楼 zhao103804 2010-09-28  
公司一直用的是mysql数据库,但是从来没有注意到这个问题,还好,公司规定表名都是小写,移植到LINUX上暂未发现问题。。
LZ发的东西很有用,以后可以避免一些问题了
3 楼 sam_chi 2010-09-28  
恩,原先有个项目在Windows下开发的没有去注意大小写,运行正常,后来移植到Linux上,全乱套了,改表名改了好久才改完……
2 楼 kgd1120 2010-09-18  
<div class="quote_title">不错!</div>
1 楼 ol_beta 2010-09-17  
学习了……

相关推荐

    有关MySQL8.0大小写敏感的问题

    ### MySQL 8.0 大小写敏感性问题详解 #### 一、引言 MySQL 8.0作为MySQL数据库的重要版本更新,引入了一系列的新特性与优化改进,其中包括对数据库和表名大小写敏感性的调整。这一变化对于新老用户来说都需要一定...

    mysql大小写敏感

    MySQL 大小写敏感 MySQL 中的大小写敏感性是指数据库名、表名、列名、别名等在不同的操作系统平台上的大小写规则。 MySQL 在 Linux 下默认情况下是严格区分表名和数据库名的大小写,而在 Windows 下则不区分大小写...

    MySQL的SQL语句大小写不敏感问题解决方案

    同时,在查询字符串时,MySQL 是大小写不敏感的,这也会导致大小写问题的产生。 在实际应用中,这个问题可能会引起一些问题,例如在插入数据时可能会发生 Duplicate entry Error,或者在查询时返回的结果不正确。...

    LINUX系统下mysql的大小写区分问题.docx

    需要注意的是,尽管可以通过这些方法来控制大小写敏感性,但最佳实践是始终以一种一致的方式编写数据库对象的名称,避免因大小写问题引发的混淆和错误。在开发和维护过程中,保持命名规范和一致性至关重要,尤其是当...

    0积分:MySql表名大小写的问题.txt

    - 这种做法可以在大多数环境中避免大小写问题。 ### 总结 理解MySQL中表名的大小写敏感性及其背后的原因对于确保数据的一致性和避免潜在错误至关重要。通过正确配置`lower_case_table_names`参数并根据实际情况...

    Mysql大小写敏感的问题

    MySQL数据库在处理字符串时对大小写的敏感性是一个重要的特性,特别是在跨平台操作时。...对于开发人员来说,遵循统一的命名规范(如始终使用驼峰式或全小写)可以减少由于大小写问题引起的潜在错误。

    PostgreSQL数据库对象名大小写敏感的解决方法

    ### PostgreSQL数据库对象名大小写敏感的解决方法 在IT领域,特别是数据库管理中,了解不同数据库管理系统...在PostgreSQL中,遵循上述指导原则可以有效避免因大小写问题导致的错误,确保数据查询和操作的顺利进行。

    MySQL数据库大小写敏感的问题

    MySQL数据库在处理数据库名、表名以及列名时的大小写敏感性问题是一个常见的困扰,尤其是在跨不同操作系统环境时。MySQL的行为受所运行的操作系统的影响,因为数据库名和表名实际上对应于数据目录中的文件名。在...

    使MySQL查询区分大小写.doc

    在MySQL中,查询默认情况下通常是不区分大小写的,但如果你想让你的查询对大小写敏感,有几种方法可以实现。以下是一些关键知识点和步骤来帮助你在MySQL中进行区分大小写的查询。 1. **设置列的Collation** - **...

    MySql下实现查询表名不区分大小写

    在MySQL数据库管理中,表名和数据库名的大小写敏感性是一个重要的配置选项,尤其是在不同操作系统环境下。在Linux系统中,默认情况下,MySQL是严格区分大小写的,这与Windows环境下的行为形成鲜明对比,后者默认不...

    mysql表名忽略大小写配置方法详解

    MySQL数据库在处理表名、数据库名以及列名时的大小写规则可能会因操作系统的差异而有所不同。...尽管可以配置MySQL忽略大小写,但这并不能解决所有可能的兼容性问题,尤其是在已存在大小写敏感数据的情况下。

    MySql查询不区分大小写解决方案(两种)

    本文将详细介绍两种解决MySQL查询不区分大小写问题的方法。 **方法一:使用BINARY函数** 在查询语句中,你可以使用BINARY函数来强制进行区分大小写的比较。BINARY关键字将字符串转换为二进制形式,从而进行字节...

    MySQL修改配置 区分大小写

    需要注意的是,如果你的应用程序已经习惯了不区分大小写的模式,切换到区分大小写可能导致一些问题,比如找不到已存在的表或列。因此,在进行这种改变之前,务必对现有的数据库结构进行检查,并确保所有的引用都是大...

    MySQL表名不区分大小写的设置方法

    此外,尽管设置为1可以使MySQL在逻辑上不区分大小写,但为了保持一致性,建议在定义表名和编写SQL语句时始终使用小写,避免因大小写问题引起不必要的困扰。 在开发过程中,特别是涉及跨平台的应用,了解并适当地...

    MySQL大小写敏感导致的问题分析

    MYSQL对大小写敏感 见字如面,见标题知内容。你有遇到过因为MYSQL对大小写敏感而被坑的体验吗? 之前看过阿里巴巴Java开发手册,在MySql建表规约里有看到: 【强制】表名、字段名必须使用小写字母或数字 , 禁止...

    数据库区分大小写的设置

    本文将深入探讨SQL Server与MySQL这两种主流数据库管理系统中关于大小写敏感性的设置。 #### SQL Server 大小写敏感性设置 SQL Server默认情况下对标识符(例如表名、列名等)是不区分大小写的。然而,在某些场景...

    mysql基础-不设置区分大小写

    在执行查询时,仍需要确保遵循表名和数据库名的原始大小写格式,以避免潜在的问题。此外,如果你已经有一个区分大小写的数据库,更改此设置可能导致已有的大小写敏感的表名无法正常识别,所以在生产环境中修改这个...

Global site tag (gtag.js) - Google Analytics