2

我正在尝试检测数据库中的表是否已经存在。但是,我编写的以下代码似乎区分大小写。如果表名是 Test 并且 $name = TEST。下面的代码将不正确。有什么办法可以使这种情况变得不敏感?或者也许有更有效的方法?

if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '$name'")) == 1) {
    ....
}
4

4 回答 4

3

确保检查lower_case_table_names系统变量的值。默认值是根据您的操作系统分配的:

  • 0 - UNIX/Linux

  • 1 - 窗户

  • 2 - 麦克

根据MySQL 文档

  • 0 - 表和数据库名称使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上。名称比较区分大小写。如果您在具有不区分大小写文件名的系统(例如 Windows 或 Mac OS X)上运行 MySQL,则不应将此变量设置为 0。如果在不区分大小写的文件系统上使用 --lower-case-table-names=0 将此变量强制为 0,并使用不同的字母大小写访问 MyISAM 表名,则可能会导致索引损坏。

  • 1 - 表名以小写形式存储在磁盘上,并且名称比较不区分大小写。MySQL 在存储和查找时将所有表名转换为小写。此行为也适用于数据库名称和表别名。

  • 2 - 表和数据库名称使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母大小写存储在磁盘上,但 MySQL 在查找时将它们转换为小写。名称比较不区分大小写。这仅适用于不区分大小写的文件系统!InnoDB 表名以小写形式存储,如 lower_case_table_names=1。

当然,您可以更改lower_case_table_names的值,但您需要导出/导入数据才能影响当前的数据库表。

于 2012-07-16T19:00:45.687 回答
2
$name = "table_name";
$result = mysql_list_tables("mydb");
$num_rows = mysql_num_rows($result);
for ($i = 0; $i < $num_rows; $i++) {
    if (strtolower(mysql_tablename($result, $i)) == strtolower($name)) {
        echo "Table detected";

    }
}
于 2012-07-16T18:41:08.993 回答
2

抱歉,无法使用该语法完成。您必须执行以下操作:

SELECT `TABLE_NAME`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE `TABLE_CATALOG` IS NULL
AND `TABLE_SCHEMA` = 'yourdatabasename'
AND `TABLE_NAME` LIKE 'yourtablename'
于 2012-07-16T18:33:53.390 回答
0

感谢您的回答,但似乎我已经回答了我自己的问题。我将使用 strtolower() 将所有表存储为小写

接着:

$LowerName = strtolower($name);
if( mysql_num_rows( mysql_query("SHOW TABLES LIKE '$LowerName'")) == 1)
{
   ....
}
于 2012-07-16T18:50:40.507 回答