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.
_
Mysqlがvarchar concat_products列に255文字を超える文字を指定しているのはなぜですか(解決済み!)
Utf8_general_ciではなくuf8_binを使用する理由
たとえば私の場合、ビューの列のデータ型をconcat_products列のテキストに変更することはできますか?
そうでない場合、mysqlがconcat_products列を切り捨てないようにするにはどうすればよいですか?
すでに以前のコメントで書いたように、 MySQLマニュアル はこう言います:
VARCHAR列の値は可変長文字列です。長さは、0〜65,535の値として指定できます。
したがって、問題はフィールドのデータ型にありません。
MySQLマニュアル も言っています:
結果は、group_concat_max_lenシステム変数で指定される最大長に切り捨てられます。デフォルト値は1024です。値はより大きく設定できますが、戻り値の有効な最大長はmax_allowed_packetの値によって制約されます。実行時にgroup_concat_max_lenの値を変更する構文は次のとおりです。valは符号なし整数です。セッション] group_concat_max_len = val;
Group_concat_max_lenの値を変更するためのオプションは次のとおりです。
--group_concat_max_len=your_value_here
group_concat_max_len=your_value_here
SET GLOBAL group_concat_max_len=your_value_here;
SET SESSION group_concat_max_len=your_value_here;
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に影響します。