Apache Derby: typ danych VARCHAR FOR BIT DATA
Opis
Łańcuch bajtów o wskazanej długości do 32672 bajtów (jest to np. wielkość obrazka o wymiarach 200 x 163).
Składnia
VARCHAR
(liczba bajtów) FOR BIT DATA
albo
CHAR VARYING
(liczba bajtów) FOR BIT DATA
albo
CHARACTER VARYING
(liczba bajtów) FOR BIT DATA
Odpowiadający typ JDBC
java.sql.Types.VARBINARY
Ograniczenia
Jeśli wstawiany łańcuch bajtów krótszy niż podany, to łańcuch bajtów nie jest automatycznie uzupełniony wartościami bajtowymi 0x20 do podanej długości.
Gdy porównywane są dwa łańcuchy bajtowe – muszą być tej samej długości.
Wyniki operacji na CHAR FOR BIT DATA
i VARCHAR FOR BIT DATA
są zawsze typu VARCHAR FOR BIT DATA
.
Bajty wstawiamy jako liczby heksadecymalne poprzedzone prefiksem X albo x, np. X’ff’.
Do przeliczenia tablicy byte[] na liczbę heksadecymalną można użyć metody opisanej przy typie CHAR FOR BIT DATA.
Uwagi
Identyczny z typem CHAR FOR BIT DATA
, ale umożliwia wstawianie większej liczby bitów, a dane krótsze niż wskazane są akceptowane bez dopełniania.
Klasa R055.java
.
package aderby.types; import aderby.DerbyUtil; import java.io.*; import java.sql.*; public class R055_VARCHAR_FOR_BIT_DATA { private static final String baza = "C:/Przyklady/R055"; private static final String skrypt = "aderby/src/resources/sqls/r055.sql"; private static final String sql1 = "INSERT INTO obrazki VALUES(DEFAULT, ?,?)"; public static void main(String[] args) { DerbyUtil.startDerbyEngine(DerbyUtil.embdriver); //Utworzenie bazy i wstawienie danych Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true"); DerbyUtil.jdbcRunScript(skrypt, con); //wstawienie danych FileInputStream fis = null; try { fis = new FileInputStream("aderby/src/resources/images/dzwonek.png"); } catch (FileNotFoundException e1) { e1.printStackTrace(); } PreparedStatement pstm = null; try { pstm = con.prepareStatement(sql1); pstm.setString(1, "dzwonek"); pstm.setBinaryStream(2, fis); pstm.execute(); } catch (SQLException e1) { e1.printStackTrace(); } //pobranie danych do pliku Statement stat = null; ResultSet rs = null; InputStream is = null; FileOutputStream fos = null; try { stat = con.createStatement(); rs = stat .executeQuery("SELECT * FROM obrazki WHERE name='dzwonek'"); while (rs.next()) { String s = rs.getString("name"); try { fos = new FileOutputStream("C:/Przyklady/" + s + ".png"); } catch (FileNotFoundException e) { e.printStackTrace(); } is = rs.getBinaryStream("obrazek"); DerbyUtil.copyStream2(is, fos); } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(fos); DerbyUtil.close(fis); DerbyUtil.close(is); DerbyUtil.close(pstm); DerbyUtil.close(rs); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownEmbeddedDB(baza); DerbyUtil.shutdownDerbyEngine(); } }
Plik r055.sql
CREATE TABLE obrazki( id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1), name VARCHAR(60), obrazek VARCHAR (32000) FOR BIT DATA ); CREATE INDEX i_name ON obrazki (name ASC);
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java
może być potrzebne skreślenie niepotrzebnych wpisów.