2009-04-22 11 views

答えて

30

データベース名にドットを使用することはできません。また、私はどの識別子でも使用しないでください。一般的な方法は、代わりにアンダースコアを使用することです。それは同じ目的を果たし、多くの混乱を避けるでしょう。 にすると、テーブル名やフィールド名に奇妙な文字やそれ以外の文字を使用する正当な理由がある場合は、それをエスケープする必要があります。私の意見では良い習慣です関わらず、あなたかどうか必要性の

SELECT `select`, `some.field name`, `crazy()naming+here` 
FROM `my-=+table` 

すべてのフィールド名をbacktickingの習慣に入るが、それはまた別の話だ:

は使用し、MySQLではバッククォートを識別子をエスケープします。

+3

私は良い練習であることを強く反対しています。 MySQL固有。あなたがする必要がある場合を除き、それをしないでください。列名は、純粋な^ [a-z0-9 _] + $であり、予約語と衝突しないようにする必要があります(imho)。postgresに相当するのは "奇妙な列名"です(大文字と小文字の区別、スペース、予約語などがあります)。 backtickingである理由 – tommym

+2

user37607 @、いくつかの情報は、悪い習慣は素晴らしいことです! – Sam

+2

@Samは、MySQLに特有のものです。つまり、別のデータベースベンダーに切り替える必要がある場合は、すべてのSQLを更新する必要があります。 MySQLエスケープ文字を変更して、ANSI_QUOTESフラグを使用してANSI準拠の構文にすることができます。http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_ansi_quotes – nickf

3

のMySQL 5.0.22がそれを許可するように表示されません:それはそれを許可しなかった場合

% mysqladmin -uroot -pXXX create foo.bar 
mysqladmin: CREATE DATABASE failed; error: 'Incorrect database name 'foo.bar'' 

でもそれ、私は強く反対をお勧めします。

少なくとも、それを使っているすべてのクエリでバッククォートを使ってそのデータベースへの参照をエスケープする必要があります。

+1

を許可しません。できます。空白やUnicode、大文字と小文字の区別があるテーブル名も同じです。あなたはそのようなトラブルを求めています。 – Thilo

7

のMySQL 5.1.6前に、データベース名とテーブル名は、ファイル名(8.2. Schema Object Namesを参照)で許可されていない/\.、または文字を含めることはできません。 5.1.6以降のバージョンでは、タブ名にバックティック(`)を付ける必要がありますが、他の人も同様にアドバイスしています。

22

.は、MySQL 5.1.6 according to the documentationの名前に使用できます。

しかし、言われているように、そして再び言われるように、にしないでください。あなたが今解決していると思うすべての問題について、あなたは後であなたを噛む5つを作成します。以来。名前を修飾するために使用されます。あなたは、データベース名、あなたがそれを使用するたびに引用する必要がありますdatabase.tableまたはtable.column *

あなたがバッククォートでこれを行うことができます。

CREATE TABLE `do.not.do.this` (col INT); 

または二重引用符を使用して次のオプションを設定した場合:

SET sql_mode='ANSI_QUOTES'; 
CREATE TABLE "asking.for.problems" (col INT); 

*厳密には正しくありません - あなたは、英数字または_または$ではありません任意の文字を引用する必要がありますが、。あなたの名前に入れるのは特に面倒なオプションです。

+1

+1「do.not.do.this」と「asking.for.problems」...ただ美しい。 "。"を使用して@RichardMorgan –

+0

テーブルの名前で: "あなたがそれを行うたびに、神は子犬を殺す"。 – user3791372

関連する問題