Как я должен использовать UUID с JavaDB / Derby и JDBC? - PullRequest
4 голосов
/ 17 октября 2010

В настоящее время я использую INT в качестве типа для первичного ключа в JavaDB (Apache Derby), но поскольку я внедряю распределенную систему, я хотел бы изменить тип на java.util.UUID .Несколько вопросов по этому поводу:

  • Какой тип данных в JavaDB / Derby я должен использовать для UUID?Я видел, как упоминалось CHAR(16) FOR BIT DATA, но я мало что знаю об этом.Является ли VARCHAR(16) альтернативой?

  • Как использовать его с JDBC?Например, в PreparedStatement, как мне установить и получить UUID?

  • Если позже мне захочется изменить базу данных на SQL Server, существует ли совместимый тип данных для java.util.UUID?

Проще, как мне использовать UUID с JavaDB / Derby и JDBC?

Ответы [ 3 ]

10 голосов
/ 18 октября 2010

UUID является 128-битным значением. Тип CHAR(16) FOR BIT DATA отражает, что для краткости это битовые данные, хранящиеся в символьной форме. Я не думаю, что VARCHAR(16) будет работать, потому что у него нет битового флага. База данных должна была бы иметь возможность преобразовывать двоичные данные в символьные данные, которые связаны с кодированием и являются рискованными. Что еще более важно, это ничего не купит. Поскольку UUID равен всегда 128 бит, вы не сэкономите место при использовании VARCHAR вместо CHAR. Таким образом, вы могли бы также использовать предполагаемый CHAR(16) FOR BIT DATA.

Я думаю, что в JDBC вы используете метод get / setBytes (), поскольку он работает с небольшими объемами двоичных данных. (Не позитивно, пришлось бы попробовать это)

И понятия не имею о части SQL Server.

3 голосов
/ 06 ноября 2012

Если вы все еще хотите использовать объект UUID в своем коде, вы можете использовать fromString для создания объектов UUID из БД и toString для их хранения в БД.

0 голосов
/ 18 октября 2010

Вы можете преобразовать UUID в строку и сохранить ее как VARCHAR. Большинство строковых форматов UUID похожи на этот: 32 цифры, разделенные дефисами: 00000000-0000-0000-0000-000000000000, поэтому вы захотите использовать VARCHAR (36) или сделать что-то вроде VARCHAR (64), если хотите , поскольку в VARCHAR не будет лишних «пробелов» - сохраняются только фактические цифры.

Как только вы преобразовали его в строку, просто вызовите Statement.SetString, чтобы включить его в оператор INSERT.

...