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

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

又有些日子没来iteye了,今天有空,来这写写东西,近日要准备做一个.net迁移java的项目,原先的项目全是.net,编码规范和风格,浓浓的微软风格。第一个切入口,把原有的新闻模块迁移过来,数据库还是原先的不变(新闻模块.net中也使用的mysql)。

在java调试过程中,发现一个很诡异的问题,总是说数据库找不到,如报

[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 后就忽略大小了写吗?

最终找到如下一段:

ValueMeaning

0Table 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.

1Table 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.

2Table 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服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值