Как хранить текст в PostgreSQL?

Ответ

Для хранения текста в PostgreSQL есть несколько типов данных:

  1. VARCHAR(n) - строка переменной длины, ограниченная n символами. Если строка короче, занимает только необходимое место. Попытка вставить строку длиннее n символов приведет к ошибке.

    CREATE TABLE users (
        name VARCHAR(100)
    );
  2. TEXT - строка переменной длины без явного ограничения по длине. Оптимальный выбор для больших текстов, таких как статьи, описания или комментарии.

    CREATE TABLE articles (
        title VARCHAR(255),
        content TEXT
    );
  3. CHAR(n) - строка фиксированной длины. Если строка короче n символов, она дополняется пробелами до указанной длины. Используется крайне редко в современных приложениях из-за неэффективности и потенциальных проблем с пробелами.

Основные рекомендации:

  • Для большинства текстовых данных, где длина не строго ограничена, используйте TEXT. Это наиболее гибкий и часто рекомендуемый тип.
  • Используйте VARCHAR(n), когда вам нужно на уровне базы данных обеспечить максимальную длину строки (например, для полей вроде username, email или коротких заголовков), чтобы предотвратить вставку слишком длинных значений.
  • Избегайте CHAR(n), так как он дополняет строки пробелами и редко подходит для современных приложений.

Пример использования с Go (с пакетом database/sql):

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq" // PostgreSQL driver
)

func main() {
    connStr := "user=postgres password=your_password dbname=your_db sslmode=disable"
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        fmt.Println("Error connecting to DB:", err)
        return
    }
    defer db.Close()

    _, err = db.Exec("INSERT INTO articles (title, content) VALUES ($1, $2)", 
        "PostgreSQL Text Types", 
        "This is a long article about PostgreSQL text storage, demonstrating the use of TEXT type for large content.")
    if err != nil {
        fmt.Println("Error inserting data:", err)
    }
    fmt.Println("Data inserted successfully.")
}

PostgreSQL эффективно хранит как TEXT, так и VARCHAR. Для большинства сценариев TEXT является предпочтительным выбором из-за своей гибкости, а VARCHAR(n) используется, когда требуется строгая валидация длины на уровне схемы.

Ответ 18+ 🔞

А, слушай, вот это тема! Ты представляешь, в PostgreSQL, блядь, для текста целых три типа есть, и народ постоянно нихуя не понимает, какой когда брать. Ёпта, сейчас разложу по полочкам, как для дебила, но ты не обижайся.

Смотри, вот они, эти три мушкетёра:

  1. VARCHAR(n) — это как твоя старая джинса, блядь. Длина переменная, но есть лимит, n символов. Влезло меньше — места меньше заняло. Попробуешь запихнуть больше — получишь по ебалу ошибкой. Типа, "эй, мудила, куда лезешь, тут не резиновое".

    CREATE TABLE users (
        name VARCHAR(100) -- Ну, имя больше ста символов? Ты блядь, инопланетянин?
    );
  2. TEXT — это, сука, безразмерные штаны, полная свобода! Хоть "Войну и мир" туда засунь. Идеально для всяких длинных писуль, описаний товаров (типа "этот чайник не только кипятит, но и дует тебе в сраку") или комментариев, где народ разливается как говно по трубам.

    CREATE TABLE articles (
        title VARCHAR(255), -- Заголовок всё-таки прижмём немного
        content TEXT -- А тут уж пиши, не обосрись, хоть диссертацию
    );
  3. CHAR(n) — о, это, блядь, реликт, как патефон. Строка фиксированной длины. Запишешь короче — он тебе пробелами задницу забьёт до нужного размера. Хуйня полная, забудь как страшный сон, никто этим не пользуется, если, конечно, ты не застрял в 80-х.

Так что же делать-то, ёпта?

  • TEXT — твой главный козырь, блядь. Для всего, где не знаешь, сколько там будет — бери TEXT и не парься. PostgreSQL с ним охуенно работает.
  • VARCHAR(n) — это когда тебе прям очень надо, чтобы в базе данных какой-то дурак не вписал email на три страницы. Ставишь лимит и спишь спокойно.
  • CHAR(n) — игнорируй, как предложение "давай останемся друзьями".

Ну и на десерт, как это в Go выглядит, если ты вдруг программист, а не просто любопытная жопа:

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq" // Драйвер для Постгре, не забудь, а то нихуя не заработает
)

func main() {
    connStr := "user=postgres password=твой_пароль dbname=твоя_база sslmode=disable"
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        fmt.Println("Ошибка подключения, ёпта:", err)
        return
    }
    defer db.Close() // Закрыть не забудь, а то ресурсы потекут

    // Всё, пихаем данные. $1, $2 — это чтобы инъекции не залетели, ты ж не мудак?
    _, err = db.Exec("INSERT INTO articles (title, content) VALUES ($1, $2)",
        "Про типы текста в PostgreSQL",
        "Длинная-предлинная простыня текста, которая спокойно влазит в тип TEXT, потому что он, блядь, безлимитный.")
    if err != nil {
        fmt.Println("Не вставилось, сука:", err)
    }
    fmt.Println("Всё, заебись, данные внутри.")
}

Короче, запомни: TEXT — для всего подряд, VARCHAR(n) — если надо играть в строгого полицейского, а CHAR(n) — выбрось нахуй из головы. Всё, вопрос закрыт, иди работай.