56

という名前の列GROUP_CONCATのデータ型を持つ製品列のクエリからの結果を連結するために使用するビューを作成しました。'varchar(7) utf8_general_ci'concat_products

問題は、MySQL が「concat_products」列の値を切り捨てることです。phpMyAdmin によると、「concat_products」列のデータ型はvarchar(341) utf8_bin

テーブル製品:

CREATE TABLE `products`(
    `productId` tinyint(2) unsigned NOT NULL AUTO_INCREMENT, 
    `product` varchar(7) COLLATE utf8_general_ci NOT NULL, 
    `price` mediumint(5) unsigned NOT NULL, 
    PRIMARY KEY (`productId`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

「concat_products_vw」ビュー:

CREATE VIEW concat_products_vw AS
SELECT
  `userId`,
    GROUP_CONCAT(CONCAT_WS('_', `product`, `productId`, `price`) 
        ORDER BY `productId` ASC SEPARATOR '*') AS concat_products
FROM
  `users`
LEFT JOIN `products` 
ON `users`.`accountBalance` >= `product`.`price`
GROUP BY `productId` 

MySQLのマニュアルによると:

VARCHAR カラムの値は可変長文字列です
長さは、MySQL 4.0.2 より前は 1 から 255、MySQL 4.0.2 では 0 から 255 の値として指定できます。


編集

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.

  1. varcharMySQL が"concat_products" 列に 255 文字を超える文字を指定するのはなぜですか? (解決しました!)

  2. なぜuf8_bin代わりにutf8_general_ci

  3. たとえば私の場合、ビューの列のデータ型を「concat_products」列のテキストに変更することは可能ですか?

  4. そうでない場合、MySQL が「concat_products」列を切り捨てないようにするにはどうすればよいですか?

4

2 に答える 2

87

以前のコメントですでに書いたように、MySQL のマニュアルには次のように書かれています。

VARCHAR 列の値は可変長文字列です。長さは 0 ~ 65,535 の値として指定できます。

したがって、問題はフィールドのデータ型にはありません。

MySQLのマニュアルにも次のように書かれています。

結果は、group_concat_max_len システム変数で指定された最大長に切り捨てられます。この変数のデフォルト値は 1024 です。戻り値の有効な最大長は max_allowed_pa​​cket の値によって制限されますが、値を大きく設定することもできます。実行時に group_concat_max_len の値を変更する構文は次のとおりです。ここで、val は符号なし整数です。セッション] group_concat_max_len = val;

group_concat_max_len の値を変更するためのオプションは次のとおりです。

  1. これをコマンドに追加して、MySQL の起動時に値を変更します。
    --group_concat_max_len=your_value_here
  2. MySQL 構成ファイル (mysql.ini) に次の行を追加します。group_concat_max_len=your_value_here
  3. MySQL の起動後に次のコマンドを実行します。
    SET GLOBAL group_concat_max_len=your_value_here;
  4. MySQL 接続を開いた後、次のコマンドを実行します。
    SET SESSION group_concat_max_len=your_value_here;

ドキュメント: SETサーバー システム変数: group_concat_max_len

于 2012-08-17T10:06:10.370 に答える
12

Jocelyn が述べたように、GROUP_CONCAT()結果のサイズは によって制限されますgroup_concat_max_lenが、それとの追加の相互作用がありORDER BY、さらに の 1/3 に切り捨てられgroup_concat_max_lenます。例については、この関連する回答を参照してください。

のデフォルト値group_concat_max_lenは 1024 であり、1024 / 3 = 341 はおそらく、concat_products のタイプがvarchar(341)元の例のように表示される理由を説明しています。句を削除したGROUP BY productId場合、concat_products は として表示されvarchar(1024)ます。

と の間の相互作用はMySQL マニュアルGROUP_CONCAT()ORDER BY記載されていませんが、少なくとも MySQL Server 5.1 に影響します。

于 2016-06-22T22:29:49.377 に答える