Zielony Smok - logo witryny

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.