2

データベースにテーブルがすでに存在するかどうかを検出しようとしています。ただし、私が作成した次のコードでは、大文字と小文字が区別されるようです。テーブル名がTestで、$ name=TESTの場合。以下のコードは正しくありません。この大文字と小文字を区別しないようにする方法はありますか?それとももっと効率的な方法がありますか?

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

4 に答える 4

3

lower_case_table_namesシステム変数の値を確認してください。デフォルト値は、OSに基づいて割り当てられます。

  • 0-UNIX / Linux

  • 1-Windows

  • 2-Mac

MySQLのドキュメントによると:

  • 0-テーブル名とデータベース名は、CREATETABLEまたはCREATEDATABASEステートメントで指定された大文字を使用してディスクに保存されます。名前の比較では大文字と小文字が区別されます。大文字と小文字を区別しないファイル名を持つシステム(WindowsやMac OS Xなど)でMySQLを実行している場合は、この変数を0に設定しないでください。大文字と小文字を区別しないファイルシステムで--lower-case-table-names=0を指定してこの変数を0に強制し、異なる大文字と小文字を使用してMyISAMテーブル名にアクセスすると、インデックスが破損する可能性があります。

  • 1-テーブル名はディスクに小文字で格納され、名前の比較では大文字と小文字が区別されません。MySQLは、ストレージとルックアップ時にすべてのテーブル名を小文字に変換します。この動作は、データベース名とテーブルエイリアスにも適用されます。

  • 2-テーブルとデータベースの名前は、CREATETABLEまたはCREATEDATABASEステートメントで指定された大文字を使用してディスクに保存されますが、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 に答える