MySql两个表同名不同大小写
我开始发疯了,因为我好像有一张幻影桌。。。但是,如果我运行以下两个查询,它不会显示在Navicat中:MySql两个表同名不同大小写,mysql,Mysql,我开始发疯了,因为我好像有一张幻影桌。。。但是,如果我运行以下两个查询,它不会显示在Navicat中: 从消息中选择count(*) 从消息中选择count(*) 我得到两组不同的结果 然而,奇怪的是,如果我运行showtables我只看到一个名为messages 这让我很害怕,因为我不知道数据是否会被错误地扔进不正确的表消息 以前有人见过这个吗 我不知道该怎么办 每个请求 运行后,显示表格状态,如“消息” messages InnoDB 10 Compact 224163 222 498892
从消息中选择count(*)代码>
从消息中选择count(*)代码>
我得到两组不同的结果
然而,奇怪的是,如果我运行showtables
我只看到一个名为messages
这让我很害怕,因为我不知道数据是否会被错误地扔进不正确的表消息
以前有人见过这个吗
我不知道该怎么办
每个请求
运行后,显示表格状态,如“消息”代码>
messages InnoDB 10 Compact 224163 222 49889280 0 53608448 8388608 208683 2014-08-23 20:16:11拉丁语和瑞典语
再更新一次
我两次都跑过:
SELECT*FROM information_schema.tables,其中table_name='Messages'代码>
SELECT*FROM information_schema.tables,其中table_name='messages'代码>
它显示多条记录,记录计数不同
可怕的是,我对数据库中的其他表运行了相同的查询,而我使用相同技术测试的所有其他表都有相同的问题
好像每个表都有两个副本,一个是大写字母,另一个是小写字母,看起来小写字母是两个表中“最新的”。我建议您使用查询信息\u schema.tables
来检查表
SELECT * FROM information_schema.tables WHERE table_name = 'Messages';
也考虑某人创建视图的可能性。
SELECT * FROM information_schema.views WHERE table_name = 'Messages';
有一个MySQL变量小写\u tables\u names
,它有一个效果;此变量的默认值取决于操作系统(Linux、Windows、OSX)。(在我们的MySQL系统上,我们将其显式设置为1。)根据参考手册:
“如果您使用的是InnoDB表,则应在所有平台上将此变量设置为1,以强制将名称转换为小写。”
(如果将此变量设置为1以外的值,则手册的这一部分不会描述您在InnoDB表中观察到的行为。)
参考:Windows还是Linux/OSx?MySQL区分大小写或不基于底层文件系统,对于Linux、OSx、BSD等,这将区分大小写,在windows上,这将是大小写密集型的,可能会导致对表名称的混淆。唯一的问题是,我无法在任何地方找到消息
表,而不是通过show tables,在查看实际数据目录时不是这样,但我仍然可以查询不同的结果。好的,如果在windows上运行,它们可能是同一个表,消息
,消息
和消息
都应该引用同一个表,因为结果不同,如果添加ORDERBY子句,它们的结果是否相同?有可能MySQL只是按照它喜欢的方式对结果进行排序,并且碰巧对表名的两种情况选择了不同的默认排序方法。不,这更奇怪,我运行了一个计数(*)-完全不同的结果。请尝试显示数据库;幸运的是,该表位于另一个数据库中。然后存在将表消息重命名为Mess
这里的视图可能就是答案。我选中了-没有视图-我将检查小写的\u TABLE\u names变量我想你正在接近。。。我运行了上面的查询,一个查询消息,一个查询消息-都返回结果。。。现在的问题是,我到底是如何得到两个名为相同的表的结果的。。真奇怪!如果我将变量改为1,小写的表仍然是“主”表吗?其他表会发生什么情况?他们被删除了吗?@99823:这真是个好问题。如果您现在更改小写字母表名称
变量,我不确定会有什么后果。。。我希望任何具有混合大小写名称的表都无法访问。(我们有innodb_file_per_table
变量集,我们所有的innodb表都是独立的.idb文件。如果您的innodb都在一个共享的innodb表空间中,我不知道……您可能想在dba.stackexchange.com上问这个问题。如果是我,我会考虑得到一些mysqldump,表名小写的表s、 具有混合大小写名称的表。。。