mysql 在linux下大小写问题以及lower_case_table_names变量的设置问题_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > mysql 在linux下大小写问题以及lower_case_table_names变量的设置问题

mysql 在linux下大小写问题以及lower_case_table_names变量的设置问题

 2016/5/12 5:37:10  zwllxs  程序员俱乐部  我要评论(0)
  • 摘要:又有些日子没来iteye了,今天有空,来这写写东西,近日要准备做一个.net迁移java的项目,原先的项目全是.net,编码规范和风格,浓浓的微软风格。第一个切入口,把原有的新闻模块迁移过来,数据库还是原先的不变(新闻模块.net中也使用的mysql)。在java调试过程中,发现一个很诡异的问题,总是说数据库找不到,如报[Err]1146-Table'tby.denewstitle'doesn'texist,经过细看,原来是java中,框架把sql中表名变成了小写
  • 标签:Linux 问题 SQL MySQL ASE
    又有些日子没来iteye了,今天有空,来这写写东西,近日要准备做一个.net迁移java的项目,原先的项目全是.net,编码规范和风格,浓浓的微软风格。第一个切入口,把原有的新闻模块迁移过来,数据库还是原先的不变(新闻模块.net中也使用的mysql)。
    
    在java调试过程中,发现一个很诡异的问题,总是说数据库找不到,如报
class="java" name="code">[Err] 1146 - Table 'tby.denewstitle' doesn't exist,

经过细看,原来是java中,框架把sql中表名变成了小写,而原先设计的mysql数据库中,表名是用大小写来间隔单词的,怀疑是大小写敏感(mysql部署在linux上),于是度娘之,网上都说,只要在my.cnf的【mysqld】节点下增加 lower_case_table_names=1 即忽略了大小写,
于是我觉得,这简单,照做之,调试java,发现照样还是找不到表,那再干脆到mysql中,直接写死查询语句如下:
select COUNT(1) from DeNewsTitle

还是报
[Err] 1146 - Table 'tby.denewstitle' doesn't exist,
,
奇了怪了,为什么它不是报:
[Err] 1146 - Table 'tby.DeNewsTitle' doesn't exist,
,
不是说只要增加 lower_case_table_names=1 后就忽略大小了写吗?
最终找到如下一段:
 
Value	Meaning
0	Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive. You should not set this variable to 0 if you are running MySQL on a system that has case-insensitive file names (such as Windows or Mac OS X). If you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result.
1	Table names are stored in lowercase on disk and name comparisons are not case sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.
2	Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive. This works only on file systems that are not case sensitive! InnoDB table names are stored in lowercase, as forlower_case_table_names=1.

 
即:lower_case_table_names为0时,硬盘中是按大小写存储的,所以查询时需要严格按存时的大小写查,为2时,mysql会把表名转成小写再存储在硬盘上,在查询时,也会先转成小写再到硬盘上查。我想,如果是这样,那么,在lower_case_table_names=1时,现有的这些有大写字母的表,应该是全部无法修改,因为它找不到原表,经试验,确实此改表,也报找不到表,于是之,先将lower_case_table_names改为0,把现有的表随便改一下名字,然后把lower_case_table_names改回为1,再把那些表名改回来(其实是让 mysql重新存储一下表名),然后在mysql中查询,不管是直接用大写查还是小写查,都能查询到了。 好了,问题解决。

值得两点注意,linux中,改my.cnf未必会生效,这时需要注意,有可能是它没有mysql的存取权限,有可能是压根没读my.cnf(特别是rpm方式安装),这里自行百度。第二是,改完lower_case_table_names一定要重启mysql服务。


发表评论
用户名: 匿名