2016-04-30 14 views
4

私は現在Windows OSで作業していますが、MySQLコミュニティサーバー5.6.30をインストールしても問題ありません。私はDBを初期化するスクリプトを持っているし、もう一度、すべて正常に動作します。同じMySQLバージョンを - -MySQL:列サイズの制限

今、私は、Linux環境でこのスクリプトを実行しようとしていると私は次のエラーを取得する:

ERROR 1074 (42000) at line 3: Column length too big for column 'txt' (max = 21845); use BLOB or TEXT instead

スクリプト -

DROP TABLE IF EXISTS text; 
CREATE TABLE `texts` (
    `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `txt` VARCHAR(50000) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

を明らかにいくつかありますLinux上で複製する必要があるWindows OS上のMySQLサーバ設定。誰でもアイデアを共有できますか? AWSのRDS上

アップデート1

それも動作しますので、当然のLinuxの上でそのわずかサービスの単なる設定の問題イムかなり確信して。

どのようにしても、UTF8でvarchar 50kに達する方法はわかりますか?私は、TEXTまたはMEDIUMTEXTまたは任意の他に、単なる古いVARCHAR(サイズ)

Updateを使用したくない2

は私が示唆されただけ探して、新しいソリューションのイムを探していないイムさまざまなソリューションを高く評価varchar(50k)がWindowsの下で動作し、Linuxの下で動作しない理由として、答えが得られません。 Btw、charcter set UTF8と照合utf8_general_ciを使用しています。

回答

自分の質問に答えるためには、それはそれは STRICT_TRANS_TABLESに設定し、削除されている必要がありますSQL_MODEの問題でした。

+2

個人的に私は50kの "varchar"はあまりにも長く、とにかく 'text'でなければなりません。 –

+0

http:// stackoverflow。com/questions/25300821/difference-varchar-and-text-in-mysql –

+0

@NiettheDarkAbsol私はテキストを使用したくない、私はそれがvarcharとして動作したい。 –

答えて

1

単にドキュメントによるとtxtの列

DROP TABLE IF EXISTS text; 
CREATE TABLE `texts` (
    `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `txt` TEXT DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 
+0

mysql varchar max size、以前のバージョンで確認できます。http://stackoverflow.com/questions/13506832/what-is-the-mysql-varchar-max-size – WLiu

+0

関連していません。私はテキストを使用しないでvarchar –

+1

を理解しています。私はWindows OS上のMySQLでutf8にvarchar(50000)を追加することができるのかと疑問に思った。 varcharの最大長は65535である。 http://dev.mysql.com/doc/refman/5.6/en/column -count-limit.html を、文字セット内の文字の最大バイト長で割ると、その列は(utf8 = 3バイト、ucs2 = 2、latin1 = 1)に設定されます。 あなたのケースのmax varcharのERRORは65535/3 = 21845 – WLiu

1

を宣言するためにテキストを使用してください:(残念ながら、この例では、私たちは本当に方法がわからない文字セットを提供していません

Although InnoDB supports row sizes larger than 65,535 bytes internally, MySQL itself imposes a row-size limit of 65,535 for the combined size of all columns:

mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000), 
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB; 

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

大きな列があります)。

utf8エンコーディングは、1文字につき1バイト、2バイトまたは3バイトを使用します。したがって、65,535バイト(MySQLの最大値)のページに安全に収まる最大文字数は21,845文字(21,845 * 3 = 65,535)です。

バージョンが似ているにもかかわらず、Windowsのスペース割り当ては控えめで、フィールドに任意の文字を格納できることが保証されているようです。 Linuxはもっとlaissez-faireの姿勢を持っているようです。文字に応じて21,845文字以上の文字列を保存することができます。

なぜこの違いが同じバージョンに存在するのかわかりません。どちらの方法もある意味で「正しい」ものです。十分な単純な回避策があります。

  • TEXTを使用してください。
  • 短い文字を含む照合に切り替えます(おそらく格納したいものです)。
  • フィールドのサイズを小さくします。
+0

ですが、私が必要とするサイズをサポートしていると思われる照合はありますか?また、アップデート1を参照してください。 –

+0

RDSの設定が同じで、UTF8とutf8_general_ciの照合を見ているので、なぜそれがうまく動作しないのか分かりません。 –

+0

@ TalBenShabtay。 。 。 「ラテン」照合には最大1バイトあります。このドキュメントは、http://dev.mysql.com/doc/refman/5.7/en/charset-mysql.htmlで確認できます。 –

0

絶対にこの問題の悪い解決策であるvarcharを使用する必要がある場合は! - 次に試してみることができるもの:

CREATE TABLE `texts` (
    `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `txt` VARCHAR(20000) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

CREATE TABLE `texts2` (
    `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `txt` VARCHAR(20000) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

CREATE TABLE `texts3` (
    `id` BINARY(16) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `txt` VARCHAR(10000) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

50000文字です。これで、クライアントアプリケーションは、テキストを別々のチャンクに分割し、各テーブルにレコードを作成する必要があります。同様にテキストを読み込むには、3つのselect文を実行する必要がありますが、50000文字になります。

これは、データベースの実装ではこれを行うことをお勧めしません。

私は大規模なテキストは、データベースの列に格納されていたいくつかの環境で働いてきた、そしてそれは常にそれが解決よりも多くの問題を引き起こして巻き取りました。

これらは実際にはディスク上のファイルにスプールする必要があり、データベースに格納されているファイルへのフルパスへの参照です。

次に、このコーパスのドキュメントにインデックスエンジンを実行します。

これよりスケーラビリティが向上し、管理が容易になります。

+0

ありがとう、私は別の解決策を探していません。私はなぜそれがうまく動作し、それはdoesntのLinuxで答えを探しています。それでおしまい 。 –

1

utf8は1文字あたり最大3バイト必要です。 utf8mb4:4; latin1:1;アスキー:1; VARCHAR(N)は、テキストのバイトの前に1バイトまたは2バイトの長さとして実装されます。これはN の文字である(バイトではない)を保持することができます。したがって、あなたがutf8を望むと言うなら、3 * Nは65535以下でなければなりません。これは2バイト長の最大値です。

はあなたtxtCHARACTER SET latin1を使用し、その後、ASCIIまたは英語以外の文字を必要としない場合VARCHARは255

の制限を持っていたいくつかの古いバージョンで実行されていない喜んでいます。

InnoDBでは、「長い」フィールド(大きなvarchars、text、blobなど)がある場合、列の一部またはすべてが別のブロックに格納されます。レコードに一緒に格納される内容には、約8000バイトの制限があります。

実際にutf8が50K必要な場合は、MEDIUMTEXTが必要です。これは3バイトの長さを使用し、最大16Mバイト(utf8は可変長エンコードであるため、おそらくさらに5M文字)を保持することができます。

ほとんどのアプリケーションでは、ascii(1バイトあたり1バイト)またはutf8mb4(1バイトあたり1バイト)のいずれかを使用できますか?後者は、絵文字やutf8が処理できない4バイト中国語を含むすべての言語を許可します。

ここでWindowsとLinuxの動作が異なる理由についてはわかりません。あなたは同じバージョンを使用していますか?バグレポートをhttp://bugs.mysql.comと提出することをお勧めします。 (そして、この質問からのリンクを提供してください)

関連する問題