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

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

という名前の列の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」列を切り捨てないようにするにはどうすればよいですか?

ベストアンサー1

以前のコメントでも書いたように、MySQL マニュアル言う:

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

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

MySQL マニュアルまたこうも言う。

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

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

おすすめ記事