web-dev-qa-db-ja.com

MySQLはGROUP_CONCAT関数の連結結果を切り捨てます

GROUP_CONCATを使用して、_concat_products_という名前の列のデータ型が'varchar(7) utf8_general_ci'の製品列に対するクエリの結果を連結するビューを作成しました。問題は、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. Mysqlがvarchar concat_products列に255文字を超える文字を指定しているのはなぜですか(解決済み!)

  2. Utf8_general_ciではなくuf8_binを使用する理由

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

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

42
pouya

すでに以前のコメントで書いたように、 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

73
Jocelyn

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

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

MySQL Manual で言及されているGROUP_CONCAT()と_ORDER BY_の相互作用は見つかりませんでしたが、少なくともMySQL Server 5.1に影響します。

8
JoshS