我正在尝试检测数据库中的表是否已经存在。但是,我编写的以下代码似乎区分大小写。如果表名是 Test 并且 $name = TEST。下面的代码将不正确。有什么办法可以使这种情况变得不敏感?或者也许有更有效的方法?
if(mysql_num_rows(mysql_query("SHOW TABLES LIKE '$name'")) == 1) {
....
}
确保检查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的值,但您需要导出/导入数据才能影响当前的数据库表。
$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";
}
}
抱歉,无法使用该语法完成。您必须执行以下操作:
SELECT `TABLE_NAME`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE `TABLE_CATALOG` IS NULL
AND `TABLE_SCHEMA` = 'yourdatabasename'
AND `TABLE_NAME` LIKE 'yourtablename'
感谢您的回答,但似乎我已经回答了我自己的问题。我将使用 strtolower() 将所有表存储为小写
接着:
$LowerName = strtolower($name);
if( mysql_num_rows( mysql_query("SHOW TABLES LIKE '$LowerName'")) == 1)
{
....
}