テーブルにTEXTカラムを作成し、MySQLでデフォルト値を指定しようとすると、エラーが発生します(少なくともWindowsでは)。テキスト列にデフォルト値を設定しない理由はわかりません。MySQLのドキュメントでは説明はありません。それは私には非論理的です(そして、デフォルト値が欲しいので、ややイライラします!)。なぜこれが許可されていないのか誰か知っていますか?
TEXT
です。これらの列にデフォルト値を設定することはできません。VARCHAR
できる。
テーブルにTEXTカラムを作成し、MySQLでデフォルト値を指定しようとすると、エラーが発生します(少なくともWindowsでは)。テキスト列にデフォルト値を設定しない理由はわかりません。MySQLのドキュメントでは説明はありません。それは私には非論理的です(そして、デフォルト値が欲しいので、ややイライラします!)。なぜこれが許可されていないのか誰か知っていますか?
TEXT
です。これらの列にデフォルト値を設定することはできません。VARCHAR
できる。
回答:
Windows MySQL v5はエラーをスローしますが、Linuxおよび他のバージョンは警告のみを発生させます。これは修正する必要があります。 WTF?
MySQLバグトラッカーのバグ#19498としてこれを修正する試みも参照してください。
2008年4月4日午後4時36分、ブライスネスビット:
MS Windowsでは「デフォルトなし」ルールはエラーですが、他のプラットフォームでは警告であることがよくあります。バグではありませんが、寛大なプラットフォームでコードを記述し、後で厳密なプラットフォームで実行すると、これに陥る可能性があります。
個人的には、私はこれをバグと見なしています。「BLOB / TEXT列にはデフォルト値を設定できません」を検索すると、Googleで約2,940件の結果が返されます。それらのほとんどは、あるシステムでは機能するが他では機能しないDBスクリプトをインストールしようとしたときの非互換性の報告です。
Linux MySQL v5.0.83-logに最初にデプロイされた、クライアントの1つ用に変更しているWebアプリケーションで同じ問題が発生しています。Windows MySQL v5.1.41を実行しています。最新バージョンのphpMyAdminを使用してデータベースを抽出しようとしても、問題のテキスト列のデフォルトは報告されません。それでも、Windowsで挿入を実行しようとすると(Linuxデプロイメントでは正常に機能します)、ABC列にデフォルトがないというエラーが表示されます。(その列の一意の値の選択に基づいて)明白なデフォルトでテーブルをローカルで再作成しようとすると、最終的に、非常に便利なBLOB / TEXT列にデフォルト値を設定できません。
繰り返しますが、プラットフォーム間で基本的な互換性を維持しないことは許容できず、バグです。
MySQL 5(Windows)でストリクトモードを無効にする方法:
/my.iniを編集して行を探します
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
と交換してください
sql_mode='MYSQL40'
MySQLサービスを再起動します(mysql5であると想定)。
net stop mysql5
net start mysql5
root / adminアクセス権がある場合、実行できる可能性があります
mysql_query("SET @@global.sql_mode='MYSQL40'");
mySQLエンジンに関する深い知識がなければ、これはメモリ節約戦略のように聞こえます。私はその理由がドキュメントのこの段落の後ろにあると思います:
各BLOBまたはTEXT値は、個別に割り当てられたオブジェクトによって内部的に表されます。これは、テーブルが開かれたときにストレージが列ごとに1回割り当てられる他のすべてのデータ型とは対照的です。
これらの列タイプを事前に入力すると、メモリ使用量とパフォーマンスが低下するようです。
主な質問として:
なぜこれが許可されないのか誰か知っていますか?
まだ答えはありませんが、簡単な検索を行ったところ、MySQLバグの MySQL開発者からの比較的新しい追加が見つかりました。
[2017年3月17日15:11]StåleDeraas
開発者による投稿:
これは確かに有効な機能リクエストであり、一見すると追加するのは簡単なように思えるかもしれません。ただし、TEXT / BLOBS値は、テーブルの読み取り/更新に使用されるレコードバッファーに直接格納されません。したがって、それらにデフォルト値を割り当てるのは少し複雑です。
これは明確な答えではありませんが、少なくともなぜ質問の出発点です。
それまでの間、コードを記述して、列をnull可能にするか、アプリケーションコードから''
それぞれに(デフォルトの)値を明示的に割り当てinsert
ます...
「TEXT / BLOBカラムでのDEFAULTのサポート」は 、MySQL Bugtrackerの機能リクエストです(バグ#21532)。
TEXT列にデフォルト値を入れたいのは私だけではないようです。この機能は、MySQLの新しいバージョンでサポートされるはずです。
MySQLのバージョン5.0ではこれを修正できません。誰かがその機能をサポートしていない(現在の)データベースとサポートしているデータベースの間でデータベースをやり取りしようとすると、非互換性とデータ損失が発生するためです。その機能。
私は通常Linuxでサイトを実行していますが、ローカルのWindowsマシンでも開発しています。この問題に何度も遭遇し、問題が発生したときにテーブルを修正しました。私は昨日アプリをインストールして誰かを助けましたが、もちろん問題が再び発生しました。だから、何が起こっているのかを理解するときがきたと判断し、このスレッドを見つけました。サーバーのsql_modeを以前のモード(デフォルト)に変更するという考えは本当に好きではないので、簡単な(私が思う)ソリューションを考え出しました。
もちろん、このソリューションでは、開発者がテーブル作成スクリプトをラップして、Windowsで実行されているMySQLの問題を補正する必要があります。ダンプファイルにも同様の概念があります。大きな注意点の1つは、パーティショニングを使用すると問題が発生する可能性があることです。
// Store the current sql_mode
mysql_query("set @orig_mode = @@global.sql_mode");
// Set sql_mode to one that won't trigger errors...
mysql_query('set @@global.sql_mode = "MYSQL40"');
/**
* Do table creations here...
*/
// Change it back to original sql_mode
mysql_query('set @@global.sql_mode = @orig_mode');
それだけです。