Проектирование базы данных с использованием двоичного представления - PullRequest
0 голосов
/ 29 сентября 2019

Я хотел бы уточнить это, поскольку я, конечно, не эксперт в базах данных и, возможно, ошибся.

У меня есть задача создать небольшую базу данных адресной книги (имя, номер телефона и т. Д.)используя прямое двоичное представление на любом языке.

Я думал, что мне нужно создать базу данных, скажем на Python, и сохранить данные в двоичном формате, поэтому я написал это.

import sqlite3 as lite

con = lite.connect('address_book.db')
cur = con.cursor()
users = (
    (1, 'USER1', 'Surname1', 'Address1'),
    (2, 'USER2', 'Surname2', 'Address2'),
)
# Convert all data in users to the binary representation 
new_arr = ()
for i in users:
    tuple_to_append = ()
    for j in i:
        if isinstance(j, int):
            tuple_to_append += (bin(j),)
        elif isinstance(j, str):
            tuple_to_append += (''.join(map(bin, bytearray(j, encoding='utf-8'))),)
    new_arr += (tuple_to_append,)

cur.execute("DROP TABLE IF EXISTS users")
cur.execute("CREATE TABLE IF NOT EXISTS users("
            "user_id INTEGER PRIMARY KEY,"
            "first_name VARCHAR(20) NOT NULL,"
            "last_name VARCHAR(20) NOT NULL,"
            "address VARCHAR(20) NOT NULL)")

cur.executemany("INSERT INTO users VALUES(?, ?, ?, ?)", new_arr)
con.commit()

Я на правильном пути?

1 Ответ

1 голос
/ 29 сентября 2019

Я на правильном пути?

Возможно, на ненужном треке, поскольку текст на самом деле сохраняется в UTF-8 (как правило) и в UTF-16(если соединение открывается через подпрограмму sqlite3_open16).Обычно используется UTF-8.

Возможно, рассмотрим следующее: -

DROP TABLE IF EXISTS পরীক্ষা ;
CREATE TABLE IF NOT EXISTS পরীক্ষা (name TEXT, altname1 BLOB, altname2 REAL, altname3 VARCHAR(20), altname4 CHARVAR(-20));
INSERT INTO পরীক্ষা VALUES('Test','ტესტი','thử nghiệm','    テスト','ටෙස්ට්');
SELECT * FROM পরীক্ষা;

Здесь все значения и имя таблицы являются словом Test на разных языках.Выше работает и результат выбора: -

enter image description here


Вы можете спросить, почему не сохранить нечисловое какДЕЙСТВИТЕЛЬНО не сбой, или как вы можете иметь отрицательное количество символов в соответствии с CHARVAR (-20).

SQlite в отношении столбцов и типов данных не является типичным.В столбцах SQlite типы являются только указанием типа данных.В SQLite вы можете хранить данные любого типа в любом типе столбца (как показано выше).

Фактически существует только 5 типов столбцов (сходство типов - это термин SQlite): -

  1. INTEGER
  2. REAL
  3. TEXT
  4. BLOB
  5. NUMERIC

Любой другой приемлемый термин, например:преобразуется в один из вышеперечисленных

  • в соответствии с комментарием

  • PRIMARY KEY, а не PRIMARY_KEY

  • Вы кодировали INTEGER PRIMARY_KEY и сказали: -

  • Хотя Python не жаловался

  • Вышеуказанное было принято за тип: INTEGER PRIMARY_KEY

Правила преобразования (применяются в указанном порядке)

  1. Если тип включает INT , затем сходство INTEGER (поэтому INTEGER PRIMARY_KEY имеет сходство INTEGER, как и PRIMARY_KEY INTEGER)
  2. Если тип включает CHAR , TEXT или CLOB , тогда сходство TEXT (следовательно, VARCHAR (20) и CHARVAR (-20) имеют сходство типов TEXT.
  3. Если тип включает BLOB сходство BLOB.
  4. Если тип включает REAL , FLOA или DOUB , тогда REAL affinity.
  5. В противном случае NUMERIC affinity.

Если бы для определения столбца использовалось следующее テスト テスト (да, это работает), тогда сходство было бы ЧИСЛО, так как имя столбца テスト, а тип - вторая часть テスト, котораяпадает до 5. Иначе NUMERIC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...