2012-01-21 3 views
1

Есть ли способ получить метаданные таблицы перед первым выполнением запроса select в таблице?Получение метаданных таблицы из mysql в java

Пересмотрено: есть ли способ получить размер столбца определенной строки и столбца данных для числовых типов: int, tinyint, bigint и т. Д.?

DatabaseMetaData md = connection.getMetaData(); 
ResultSet rs = dbmd.getColumns(null, null, tableName, "%"); 

Я не могу использовать приведенный выше код в качестве COLUMN_SIZE для числового типа (int,tinyint,bigint,etc) возвратит максимально допустимый размер для этих типов. Мне нужно получить columnDisplaySize.

Приведенный выше код вернет 10 для int(8), но мне нужно 8, которое я могу получить из resultMetaData таблицы.

Итак, есть способ сделать это, не запуская сначала инструкцию select.

Благодаря

ответ

4

Вы можете проверить в какой таблицу information_schema в MySQL способен дать вам. Иногда вы можете использовать их в своих интересах. Я сделал быстрый взгляд, и ничто не ударило меня немедленно изнутри.

MySQL Информация Схема: http://dev.mysql.com/doc/refman/5.6/en/information-schema.html

1

см ниже статьи:

Поможет вам знать, понять пример из JDBC метаданных Получить таблицу

http://roseindia.net/jdbc/Jdbc-meta-data-get-tables.shtml

+0

Я знаю, что я могу получить метаданные из результирующих после выполнения запроса на выборке, но я хочу знать, если есть любым другим способом, кроме того, что выполняется запрос select в таблице. – Ankur

2

Как @technocrat сказал, проверить этот запрос на information_schema

ВЫБОР column_name, COLUMN_TYPE ИЗ INFORMATION_SCHEMA.COLUMNS где table_schema = '[Таблица схемы] и table_name =' [имя таблицы]

1

В случае INT(8) вы должны знать, что 8 не является пределом размера. Это частое заблуждение пользователей MySQL. Аргумент для типов данных, подобных INT, является лишь подсказкой для SQL, чтобы заполнить значения, если они имеют меньше цифр, чем аргумент. Обычно он используется только для ZEROFILL.

CREATE TABLE foo (i1 INT(8) ZEROFILL, i2 INT(16) ZEROFILL); 
INSERT INTO foo VALUES (1234, 1234); 
SELECT * FROM foo; 
+----------+------------------+ 
| i1  | i2    | 
+----------+------------------+ 
| 000| 00000000000| 
+----------+------------------+ 

Значение 8 против 16 не изменяет объем памяти, необходимый INT, или диапазон поддерживаемых значений. Тип данных INT всегда 32-бит и всегда позволяет значения от -2 до 2 -1, независимо от аргумента, который вы ему даете.

Также TINYINT всегда 8 бит, SMALLINT всегда 16 бит, MEDIUMINT всегда 24 бит, а BIGINT всегда 64 бит.

Значение 10, которое вы получаете, это числовая точность, а не ограничение по размеру.То есть, 32-битное значение может использовать до 10 цифр при отображении в базовых 10:

SELECT LENGTH(POW(2,31)); 
+-------------------+ 
| LENGTH(POW(2,31)) | 
+-------------------+ 
|    10 | 
+-------------------+ 
Смежные вопросы