web-dev-qa-db-ja.com

MySQLでビューのデータ型を定義するにはどうすればよいですか?

テーブルに対して単純な集計ビューを作成しましたが、ビューはテーブルとは異なるデータ型を返します。これにより、アプリケーション側でいくつかの問題が発生します。

以下は、例のために簡略化したクエリです。

_SELECT id, FLOOR(date_id / 100) month_id, SUM(value) FROM some_table WHERE....;
_

問題は、data_idがINTEGER(11)列であり、アプリではint32として表され、FLOOR(date_id / 100)の結果はBIGINTであり、アプリではint64として表されます。

説明できない理由により、idのタイプもint64からint32に変更されます。

列をint32にキャストする方法はありますか? [〜#〜] cast [〜#〜] が機能していないようです。ビューの結果セットの予期されるデータ型が何であるかを確認する方法についてのドキュメントは見つかりませんでした。

4
OmerGertel

INFORMATION_SCHEMAの列定義を探すことができます。たとえば、テーブルmydb.mytbで必要な列名がmycolの場合、次のようにします。

SELECT column_type FROM information_schema.columns
WHERE table_schema='mydb'
AND table_name='mytb'
AND column_name='mycol';

あなたの質問にある数式を含むクエリの場合:

SELECT id, FLOOR(date_id / 100) month_id, SUM(value) FROM some_table WHERE....;

FALSEで評価されたWHERE句を含むクエリを使用して、独自の空の一時テーブルを作成してみます。

CREATE TABLE IF NOT EXISTS test.mycolumnmap
SELECT id, FLOOR(date_id / 100) month_id, SUM(value) value FROM some_table WHERE 1=2;

そのテーブルは空ですが、明確なテーブル構造といくつかの列タイプが定義されています。次に、同じクエリを実行して、一時テーブルから列タイプを取得します。

SELECT column_name,column_type FROM information_schema.columns
WHERE table_schema='test'
AND table_name='mycolumnmap'
AND column_name IN ('id','month_id','value');

別の方法は、ビューの列について直接INFORMATION_SCHEMAに尋ねることです。

SELECT column_name,column_type FROM information_schema.columns
WHERE table_schema='test'
AND table_name='view_name';

試してみる !!!

2
RolandoMySQLDBA

これは、MySQLのWebサイトから直接取得され、解決策になる可能性があります。

The Lynxyによる2009年3月9日8:56 amの投稿

MySQL 5.1は、CAST()を使用すると64ビット整数を返します。 32ビットの符号付き整数を32ビットの符号なし整数にキャストする場合は、この方法で関数を使用できます。

-1062731519を符号なし整数に変換します(この数値は10進値の192.168.1.1です):

SELECT CAST(( '-1062731519'&0xFFFFFFFF)AS UNSIGNED INTEGER);

結果は3232235903で、これは正しいです。

http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html

0
randomx