mysql - 无法针对 mysql 5.1.69 的 innoDB 创建名称为混合大小写 Service 的表

标签 mysql innodb

以下创建表(针对默认的 MyISAM)正确执行并创建表:

如果存在则删除表服务; 创建表服务 ( idService INT, 主键(idService) );

但是,当在 mysql 5.1.69 的内置 innodb 中创建时,它会失败。

如果存在则删除表服务; 创建表服务 ( idService INT, 主键(idService) ) ENGINE=InnoDB;

Error: Can't create table 'myDatabase.Service' (errno: -1)(1005)

内置 innodb 是与插件不同的代码库,但 5.1.69 的大部分内容似乎与 1.0.3 的插件类似——它使用的是内置 innodb。

如果该表在同一服务器上名为 Zervice,则它可以在 InnoDB 上正常工作。

如果存在则删除表Zervice; 创建表 Zervice ( idService INT, 主键(idService) ) ENGINE=InnoDB;

更奇怪的是,如果该表以大写形式命名为 SERVICE,则它会被创建。

如果存在则删除表服务; 创建表 服务 ( idService INT, 主键(idService) ) ENGINE=InnoDB;

但是,我使用混合大小写的其他名称创建许多其他表,没有任何问题。我手动和 mysql 工作台都无法针对 innoDB 创建表服务。

此外,在另一台运行 5.0 的服务器上,该表可以在 innoDB 中创建为服务,并且已经这样运行了一段时间(在上面的测试中,我使用了一个已执行和测试的缩减表)。

Service 这个词没有列在 mysql 的关键字页面 (http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html) 上,但是问题似乎是 innoDB 特定的,并且没有单独的 innoDB 关键字列表(如果有的话)。另请注意,表名称周围使用了左倾引号。

从 information_schema.TABLES 中选择 table_name,其中 upper(table_name) = 'SERVICE'; 不返回任何行。

任何人都可以解释为什么“服务”这个词对于 5.1 版本的 innoDB 很重要,或者为什么在这种情况下大小写很重要(所有服务器都是 Ubuntu)?

最佳答案

http://dev.mysql.com/doc/refman/5.1/en/innodb-error-codes.html

1005 (ER_CANT_CREATE_TABLE)

Cannot create table. If the error message refers to error 150, table creation failed because a foreign key constraint was not correctly formed. If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.

所以它不是 SQL 保留字,但它显然与 InnoDB 中的某些内容冲突。

PS:如果您使用的是 MySQL 5.1.69,我强烈建议您只使用 InnoDB 插件,而不要使用 InnoDB 内置插件。请参阅http://dev.mysql.com/doc/refman/5.1/en/replacing-builtin-innodb.html

<小时/>

更新:我自己在 MySQL 社区版 5.1.70 的 MySQL Sandbox 安装上尝试过此操作,但无法重现任何问题。也就是说,我可以毫无错误地创建表 ServiceSERVICE

select table_name from information_schema.TABLES where upper(table_name) = 'SERVICE';
+------------+
| table_name |
+------------+
| SERVICE    |
| Service    |
+------------+

show create table Service\G

CREATE TABLE `Service` (
  `idService` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`idService`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

偶尔我发现 InnoDB 的数据字典很困惑。要么通过损坏,要么做一些不明智的事情,例如使用 rm 而不是使用 DROP TABLE 删除 MySQL 外部的 InnoDB 表。因此,内部数据字典可能会认为您仍然有一个名为 Service 的表,即使磁盘上物理上没有该表,并且 information_schema 也不会报告该表。

如果是这种情况,如果不采取一些严厉的措施,您可能无法纠正这种情况,例如:

  1. 暂时将所有 InnoDB 表转换为 MyISAM。
  2. 关闭 mysqld。
  3. 删除 ibdata1(这是 InnoDB 存储其数据字典的位置)。
  4. 启动 mysqld。
  5. 将所有表重新转换回 InnoDB。

我不能保证这是错误的根本原因,但这些步骤将重建数据字典。

关于mysql - 无法针对 mysql 5.1.69 的 innoDB 创建名称为混合大小写 Service 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18117557/

相关文章:

mysql - 如何锁定尚不存在的 InnoDB 行?

java - Hibernate 3 与 mysql

mysql innodb_locks 表转储到文件

mysql - 使用 MySQL 中的附加列过滤器从 Information Schema 获取行数

mysql - 了解 mysql 字符集和排序规则

MySQL 性能严重下降前的最大行数

MySQL 5.5 LONGBLOB 列数据对于第 1 行的列 'x' 太长

mysql - 在 MySQL 中从 HAVING COUNT(*) 中删除

MySQL:从同一个表中选择具有相同名称的两列

各种类型的 MySQL 列