【问题标题】:A table can not be created with the name Service in mixed case against innoDB of mysql 5.1.69无法针对 mysql 5.1.69 的 innoDB 以混合大小写创建名称为 Service 的表
【发布时间】:2013-08-09 15:59:09
【问题描述】:

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

如果存在则删除表Service; 创建表Service ( idServiceINT, 主键 (idService) );

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

如果存在则删除表Service; 创建表Service ( idServiceINT, 主键 (idService) ) 引擎=InnoDB;

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

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

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

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

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

如果存在则删除表 SERVICE; 创建表SERVICE ( idServiceINT, 主键 (idService) ) 引擎=InnoDB;

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

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

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

从 information_schema.TABLES 中选择表名,其中上(表名)='服务'; 不返回任何行。

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

【问题讨论】:

    标签: mysql innodb


    【解决方案1】:

    您可以创建名为Service 的表。我检查了 MySQL 5.5.32

    以下对我有用

    DROP TABLE IF EXISTS `Service`; CREATE TABLE `Service` ( idService INT, PRIMARY KEY (idService) );
    DROP TABLE IF EXISTS Service; CREATE TABLE Service ( idService INT, PRIMARY KEY (idService) ) ENGINE=InnoDB;
    

    当我执行上述 2 个命令时,我得到 2 个表 ServiceSERVICE。可能是mysql 5.1.69 中的一个错误(不知道)。如果可能,请尝试升级 MySQL。

    下表详细信息。

    Name       Engine    Rows    Data Size   Index Size    Total Size
    -----------------------------------------------------------------
    SERVICE    InnoDB     0        16K           0            16K
    Service    InnoDB     0        16K           0            16K
    

    SHOW VARIABLES LIKE '%version%'的输出

    Variable_name              Value
    ---------------------------------
    innodb_version             5.5.32
    protocol_version           10
    slave_type_conversions
    version                    5.5.32
    version_comment            MySQL Community Server (GPL)
    version_compile_machine    x86_64
    version_compile_os         Linux
    

    【讨论】:

    • 感谢您尝试复制。您没有在查询中指定引擎。它适用于 MyISAM,但不适用于 innoDB。 '引擎 = InnoDB;'查询结束时很重要,因为大多数服务器默认使用 MyISAM,也许你知道你的默认使用 InnoDB,但它仍然会让人放心。问题也可能是特定于 mysql 的版本,因为它似乎介于 5.0 和 5.1 之间。如果它在 5.5 中很好,内置的 innoDB 仍然给人希望。
    • 我将默认引擎设置为 InnoDB 并使用内置的 InnoDB 我已经更新了答案的详细信息。
    【解决方案2】:

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

    1005 (ER_CANT_CREATE_TABLE)

    无法创建表。如果错误消息涉及错误 150,则表创建失败,因为未正确形成外键约束。如果错误消息涉及错误 –1,则表创建可能失败,因为该表包含与内部 InnoDB 表的名称匹配的列名。

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

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


    更新:我自己在 MySQL Community edition 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。

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

    【讨论】:

    • 经过几天的丢弃、重建等,我仍然遇到同样的问题。正如您所说,该错误仅表明它“与innoDB中的某些内容冲突”。我不控制使用的基础架构版本,所以我放弃并使用不同的表名。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2010-11-13
    相关资源
    最近更新 更多