Я хочу создать текстовое поле в базе данных без определенного размера (это сохранит текст длины, неизвестной в некотором случае) - конкретный текст является сериализированным простым объектом (~ JSON)
Что является большей частью базы данных независимый способ сделать это: - varchar без указанного размера (не думают вся поддержка дб это) - 'текстовое' поле, это, кажется, распространено, но я не полагаю, что это - стандарт - блоб или другой объект того вида? - varchar очень большой размер (это неэффективно и тратит впустую дисковое пространство, вероятно) - Другой?
Я использую JDBC, но я хотел бы использовать что-то, что поддерживается в большей части DB (оракул, mysql, postgresql, дерби, HSQL, H2 и т.д....)
Спасибо.
varchar очень большого размера ( это неэффективно и, вероятно, тратит впустую дисковое пространство)
Это будет наиболее переносимый вариант. Ограничьте себя до 2000 символов, и вас будет хорошо для большинства баз данных (oracle является текущим ограничителем 2000, но также будьте осторожны с старыми версиями mysql). Я бы тоже не стал слишком беспокоиться о дисковом пространстве. Большинство баз данных используют диск только для фактических данных, сохраненных в поле.
Используйте большой двоичный объект. API JDBC2.0 поддерживает его, поэтому любой драйвер, поддерживающий JDBC2.0 (включая J2SE 5.0), должен его поддерживать.
Преимущества BLOB:
1. Размер может достигать 4G-1 (Oracle. Другие базы данных не уверены)
2. Может хранить любые данные по вашему желанию (даже изображения, сериализованные в какое-либо поле в вашей структуре JSON)
3. Полностью нейтрален при транспортировке через ОС
4. Вы по-прежнему можете использовать индексы для ключей, которые ссылаются на большой двоичный объект, так что поиск по идентификаторам и т. Д. Необязательно должен выполняться путем доступа к структуре.
Используйте фреймворк, например hibernate, чтобы у вас не было проблем с поиском универсального решения. Не думаю, что в каждой упомянутой базе данных можно использовать один универсальный тип. Думаю, базы данных сильно различаются.
Вам действительно нужно поддерживать все шесть этих баз данных? (подсказка: нет.)
Я пришел к мнению, что написание универсально переносимого SQL DDL не стоит таких хлопот. YAGNI.
Вы должны поддерживать базы данных, которые вы используете в настоящее время, и быть готовыми адаптироваться к базе данных, которую вы примете в будущем.
По поводу вашего комментария: Единственными стандартными типами данных переменной длины в SQL являются VARCHAR
и BLOB
. VARCHAR
предназначен для строковых данных, и его объявление включает набор символов и коллизию. BLOB
предназначен для двоичных данных и не поддерживает набор символов/коллаборацию.
Другие типы данных, такие как VARCHAR(max)
, CLOB
или TEXT
являются расширениями производителя:
VARCHAR(max)
: MS SQL ServerNVARCHAR(max)
: MS SQL ServerLONGVARCHAR
: Derby, H2, HSQLDBCLOB
: Derby, H2, HSQLDB, Oracle, SQLiteNCLOB
: OracleTEXT
: MS SQL Server, MySQL, PostgreSQL, SQLiteNTEXT
: MS SQL Serverтекст, возможно, лучше всего , но вскоре будет удален из SQL Server, и нет независимой от СУБД опции для всех , которые вы указали.
При этом, когда дело доходит до SQL, переносимость переоценивается. Вы с большей вероятностью измените свой клиентский код до того, как смените СУБД. Выберите один и продолжайте ...