web-dev-qa-db-ja.com

MySQLが長すぎるvarchar切り捨て/エラー設定

2つのMySQLインスタンスがあります。 1つ目は、データが長すぎる場合に挿入時に文字列を切り捨てます。 2番目のものはエラーを発生させます:

ERROR 1406 (22001): Data too long for column 'xxx' at row 1

2番目のものもデータを切り捨てます。この動作を管理するためのMySQL設定はありますか?

32
Maksym Polshcha

STRICT_TRANS_TABLESおよびSTRICT_ALL_TABLESを無効にできます。これにより、挿入された文字列の自動切り捨てが可能になります。

MySQL Documantationからの引用。

厳密モードは、MySQLがINSERTやUPDATEなどのデータ変更ステートメントの無効な値や欠損値を処理する方法を制御します。値はいくつかの理由で無効になる場合があります。たとえば、列のデータ型が間違っているか、範囲外である可能性があります。挿入する新しい行に、定義に明示的なDEFAULT句がないNULL以外の列の値が含まれていない場合、値が欠落しています。 (NULL列の場合、値が欠落しているとNULLが挿入されます。)

リファレンス: MySQL Server SQLモード

42
bansi

厳密なSQLモードが有効になっておらず、列の最大長を超える値をCHARまたはVARCHAR列に割り当てると、値が収まるように切り捨てられ、警告が生成されます。スペース以外の文字の切り捨ての場合、(警告ではなく)エラーを発生させ、厳密なSQLモードを使用して値の挿入を抑制することができます。セクション6.1.7「サーバーSQLモード」を参照してください。

変更方法: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html


厳格モードを無効にする2つの方法を見つけました。

  1. my.cnfに以下を追加します

    sql-mode = "NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION"

  2. 方法はmysqlコンソールを使用しています。

    SET @@ global.sql_mode = '';

実稼働環境で実行する前にテストしてください。

cpanelを使用する場合、

取り替える

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

/usr/my.cnfに

sql-mode=""

走る

/etc/init.d/mysql restart
1
Mikel Tawfik