PostgreSQL 字段类型选择最佳实践 - Java 开发者指南

Oracle转PostgreSQL Oracle转PostgreSQL PostgreSQL 13.1 手册 阿里云帮助中心 前言 从2019年开始,就有一个很火热的话题:“去O化”。O就是oracle,也就是将oracle替换成别的数据库。 原因: oracle是收费的,为了进一步降低成本; 以美国为首的西方国家对华科技种种遏制行为,最近越闹越厉害,最近docker的付费服务就禁止中国企业使用; 甲骨文公司中国区大幅度裁员,或将放弃中国市场也说不定; 2020年12月31起,甲骨文公司将不再对oracle11.2版本提供技术支持, 阅读详情

PostgreSQL 字段类型选择最佳实践 - Java 开发者指南

一、核心原则

1.1 数据类型选择的关键考量

  • 存储效率:最小化存储空间,提升I/O性能
  • 查询性能:支持高效索引和查询操作
  • 类型安全:避免隐式类型转换带来的性能损失
  • Java映射清晰:减少ORM框架的配置复杂度

二、Java与PostgreSQL类型映射详解

2.1 数值类型

Java 类型PostgreSQL 类型说明使用场景
IntegerINTEGER4字节,-2147483648 到 +2147483647主键、状态码、数量
LongBIGINT8字节,大范围整数ID、时间戳、大数值
ShortSMALLINT2字节,-32768 到 +32767枚举值、小范围状态
BigDecimalNUMERIC(precision, scale)精确小数,可变长度金额、精确计算
DoubleDOUBLE PRECISION8字节浮点数科学计算、非精确数值
FloatREAL4字节浮点数一般浮点计算

示例代码:

-- 数值类型字段定义
CREATE TABLE financial_data (
    id BIGINT PRIMARY KEY,              -- Java Long
    user_id INTEGER NOT NULL,           -- Java Integer
    status SMALLINT DEFAULT 0,          -- Java Short
    amount NUMERIC(15,2) NOT NULL,      -- Java BigDecimal
    tax_rate DOUBLE PRECISION,          -- Java Double
    score REAL                          -- Java Float
);

2.2 字符串类型

Java 类型PostgreSQL 类型说明使用场景
StringVARCHAR(n)变长字符串,有长度限制用户名、标题、代码
StringTEXT变长字符串,无长度限制内容、描述、JSON
StringCHAR(n)定长字符串固定长度代码(如国家码)
StringUUIDUUID字符串分布式ID、唯一标识

最佳实践:

  • 明确长度限制的用 VARCHAR(n)
  • 不确定长度或大文本用 TEXT
  • PostgreSQL中 TEXT 性能与 VARCHAR 相当

2.3 日期时间类型

Java 类型PostgreSQL 类型说明使用场景
java.time.LocalDateDATE日期(无时间)生日、创建日期
java.time.LocalTimeTIME时间(无日期)营业时间、提醒时间
java.time.LocalDateTimeTIMESTAMP日期时间(无时区)创建时间、更新时间
java.time.InstantTIMESTAMPTZ带时区时间戳国际化系统、日志
java.time.DurationINTERVAL时间间隔时长计算、过期时间

示例代码:

-- 日期时间字段定义
CREATE TABLE system_logs (
    id BIGSERIAL PRIMARY KEY,
    event_date DATE NOT NULL,                    -- LocalDate
    event_time TIME,                             -- LocalTime
    created_at TIMESTAMP DEFAULT NOW(),          -- LocalDateTime
    updated_at TIMESTAMPTZ,                      -- Instant
    duration INTERVAL                            -- Duration
);

2.4 布尔类型

Java 类型PostgreSQL 类型说明
BooleanBOOLEAN真值类型

使用建议:

-- 布尔字段定义
CREATE TABLE user_settings (
    id BIGINT PRIMARY KEY,
    is_active BOOLEAN DEFAULT TRUE,
    email_verified BOOLEAN DEFAULT FALSE,
    two_factor_enabled BOOLEAN DEFAULT FALSE
);

2.5 二进制数据

Java 类型PostgreSQL 类型说明
byte[]BYTEA二进制数据
byte[]BLOB大二进制对象

2.6 特殊类型

Java 类型PostgreSQL 类型说明
StringJSONB二进制JSON(推荐)
StringJSON文本JSON
java.util.UUIDUUIDUUID类型
java.net.InetAddressINETIP地址
EnumENUM 或 VARCHAR枚举类型

三、综合实战示例

3.1 电商系统数据库设计

-- 创建枚举类型
CREATE TYPE order_status AS ENUM (
    'PENDING', 
    'CONFIRMED', 
    'SHIPPED', 
    'DELIVERED', 
    'CANCELLED'
);

CREATE TYPE user_role AS ENUM (
    'CUSTOMER', 
    'SELLER', 
    'ADMIN'
);

-- 用户表
CREATE TABLE users (
    id BIGSERIAL PRIMARY KEY,                    -- Long (自增主键)
    uuid UUID UNIQUE NOT NULL DEFAULT gen_random_uuid(), -- UUID (分布式ID)
    username VARCHAR(50) UNIQUE NOT NULL,        -- String (用户名)
    email VARCHAR(255) UNIQUE NOT NULL,          -- String (邮箱)
    password_hash VARCHAR(255) NOT NULL,         -- String (密码哈希)
    full_name VARCHAR(100) NOT NULL,             -- String (全名)
    phone_number VARCHAR(20),                    -- String (电话号码)
    role user_role NOT NULL DEFAULT 'CUSTOMER',  -- 枚举类型
    avatar_url TEXT,                             -- String (头像URL)
    date_of_birth DATE,                          -- LocalDate (生日)
    is_active BOOLEAN DEFAULT TRUE,              -- Boolean (是否激活)
    email_verified BOOLEAN DEFAULT FALSE,        -- Boolean (邮箱验证)
    created_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant (创建时间)
    updated_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant (更新时间)
    metadata JSONB                               -- Map<String, Object> (元数据)
);

-- 商品表
CREATE TABLE products (
    id BIGSERIAL PRIMARY KEY,                    -- Long
    seller_id BIGINT NOT NULL,                   -- Long (商家ID)
    sku VARCHAR(50) UNIQUE NOT NULL,             -- String (库存单位)
    name VARCHAR(200) NOT NULL,                  -- String (商品名称)
    description TEXT,                            -- String (商品描述)
    category VARCHAR(100) NOT NULL,              -- String (分类)
    price NUMERIC(10,2) NOT NULL,                -- BigDecimal (价格)
    original_price NUMERIC(10,2),                -- BigDecimal (原价)
    stock_quantity INTEGER DEFAULT 0,            -- Integer (库存数量)
    weight_kg DOUBLE PRECISION,                  -- Double (重量kg)
    dimensions JSONB,                            -- Map (尺寸信息)
    tags TEXT[],                                 -- String[] (标签数组)
    is_available BOOLEAN DEFAULT TRUE,           -- Boolean (是否可用)
    average_rating REAL DEFAULT 0.0,             -- Float (平均评分)
    review_count INTEGER DEFAULT 0,              -- Integer (评价数量)
    created_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant
    updated_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant
    
    CONSTRAINT fk_seller FOREIGN KEY (seller_id) REFERENCES users(id)
);

-- 订单表
CREATE TABLE orders (
    id BIGSERIAL PRIMARY KEY,                    -- Long
    order_number VARCHAR(50) UNIQUE NOT NULL,    -- String (订单号)
    user_id BIGINT NOT NULL,                     -- Long (用户ID)
    status order_status DEFAULT 'PENDING',       -- 枚举 (订单状态)
    total_amount NUMERIC(12,2) NOT NULL,         -- BigDecimal (总金额)
    discount_amount NUMERIC(10,2) DEFAULT 0,     -- BigDecimal (折扣金额)
    shipping_fee NUMERIC(8,2) DEFAULT 0,         -- BigDecimal (运费)
    tax_amount NUMERIC(10,2) DEFAULT 0,          -- BigDecimal (税费)
    shipping_address JSONB NOT NULL,             -- Map (收货地址)
    payment_method VARCHAR(50) NOT NULL,         -- String (支付方式)
    estimated_delivery DATE,                     -- LocalDate (预计送达)
    ordered_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant (下单时间)
    paid_at TIMESTAMPTZ,                         -- Instant (支付时间)
    shipped_at TIMESTAMPTZ,                      -- Instant (发货时间)
    delivered_at TIMESTAMPTZ,                    -- Instant (送达时间)
    cancelled_at TIMESTAMPTZ,                    -- Instant (取消时间)
    cancellation_reason TEXT,                    -- String (取消原因)
    
    CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 订单项表
CREATE TABLE order_items (
    id BIGSERIAL PRIMARY KEY,                    -- Long
    order_id BIGINT NOT NULL,                    -- Long (订单ID)
    product_id BIGINT NOT NULL,                  -- Long (商品ID)
    quantity SMALLINT NOT NULL,                  -- Short (数量)
    unit_price NUMERIC(10,2) NOT NULL,           -- BigDecimal (单价)
    subtotal NUMERIC(10,2) NOT NULL,             -- BigDecimal (小计)
    product_snapshot JSONB NOT NULL,             -- Map (商品快照)
    
    CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(id),
    CONSTRAINT fk_product FOREIGN KEY (product_id) REFERENCES products(id)
);

-- 支付记录表
CREATE TABLE payment_records (
    id BIGSERIAL PRIMARY KEY,                    -- Long
    order_id BIGINT NOT NULL,                    -- Long
    payment_id VARCHAR(100) UNIQUE NOT NULL,     -- String (支付平台ID)
    amount NUMERIC(10,2) NOT NULL,               -- BigDecimal
    currency CHAR(3) DEFAULT 'CNY',              -- String (货币代码)
    payment_status VARCHAR(20) NOT NULL,         -- String (支付状态)
    gateway_response JSONB,                      -- Map (支付网关响应)
    created_at TIMESTAMPTZ DEFAULT NOW(),        -- Instant
    completed_at TIMESTAMPTZ,                    -- Instant
    
    CONSTRAINT fk_order_payment FOREIGN KEY (order_id) REFERENCES orders(id)
);

3.2 索引优化建议

-- 用户表索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_created_at ON users(created_at);
CREATE INDEX idx_users_role ON users(role);

-- 商品表索引
CREATE INDEX idx_products_seller ON products(seller_id);
CREATE INDEX idx_products_category ON products(category);
CREATE INDEX idx_products_price ON products(price);
CREATE INDEX idx_products_created_at ON products(created_at);
CREATE INDEX idx_products_tags ON products USING gin(tags);

-- 订单表索引
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_orders_ordered_at ON orders(ordered_at);
CREATE INDEX idx_orders_order_number ON orders(order_number);

-- 支付记录索引
CREATE INDEX idx_payments_order ON payment_records(order_id);
CREATE INDEX idx_payments_status ON payment_records(payment_status);
CREATE INDEX idx_payments_created_at ON payment_records(created_at);
-- =============================================
-- 用户管理系统数据库设计示例 (PostgreSQL)
-- 作者:Java 后端开发工程师
-- 日期:2025年11月17日
-- 目标:演示合理字段类型选择 + Java 映射 + 性能优化
-- =============================================

-- 创建用户表
CREATE TABLE users (
    -- 主键:推荐使用 BIGSERIAL(自动递增 BIGINT),适合高并发场景
    id BIGSERIAL PRIMARY KEY,
    
    -- 用户名:使用 VARCHAR(64) 限制长度,避免无限增长,支持索引
    username VARCHAR(64) NOT NULL UNIQUE,
    
    -- 密码哈希:固定长度,使用 CHAR(64) 或 VARCHAR(255),这里用 VARCHAR 更灵活
    password_hash VARCHAR(255) NOT NULL,
    
    -- 邮箱:使用 VARCHAR(255),支持国际邮箱格式
    email VARCHAR(255) NOT NULL UNIQUE,
    
    -- 真实姓名:可选,使用 TEXT 更灵活,支持长名字
    full_name TEXT,
    
    -- 年龄:使用 SMALLINT,因为年龄不会超过 32767
    age SMALLINT CHECK (age >= 0 AND age <= 150),
    
    -- 性别:使用 BOOLEAN(0=女,1=男)或 ENUM,这里用 BOOLEAN 更高效
    gender BOOLEAN DEFAULT TRUE, -- TRUE=男, FALSE=女
    
    -- 账户余额:金融字段,必须使用 NUMERIC(18,2) 保证精度
    balance NUMERIC(18,2) NOT NULL DEFAULT 0.00,
    
    -- 用户状态:使用 SMALLINT 编码(0=禁用,1=启用,2=待审核),节省空间
    status SMALLINT NOT NULL DEFAULT 1 CHECK (status IN (0, 1, 2)),
    
    -- 注册时间:使用 TIMESTAMPTZ,自动记录 UTC 时间,支持时区转换
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    
    -- 最后登录时间:可为空,使用 TIMESTAMPTZ
    last_login_at TIMESTAMPTZ,
    
    -- 用户角色:使用 JSONB 存储多个角色,支持灵活扩展和查询
    roles JSONB NOT NULL DEFAULT '["user"]'::jsonb,
    
    -- 用户偏好设置:使用 JSONB 存储键值对,如 {"theme": "dark", "lang": "zh"}
    preferences JSONB,
    
    -- 头像 URL:使用 TEXT,允许长链接
    avatar_url TEXT,
    
    -- 是否删除标记:软删除字段,使用 BOOLEAN
    is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
    
    -- 版本号:乐观锁,使用 INTEGER
    version INTEGER NOT NULL DEFAULT 0
);

-- 创建索引以提升查询性能
-- 对频繁查询的字段建立索引(如 username, email, status)
CREATE INDEX idx_users_username ON users (username);
CREATE INDEX idx_users_email ON users (email);
CREATE INDEX idx_users_status ON users (status);
CREATE INDEX idx_users_created_at ON users (created_at DESC); -- 按时间倒序索引

-- 为 JSONB 字段创建 GIN 索引以支持快速查询
-- 例如:查找拥有 "admin" 角色的用户
CREATE INDEX idx_users_roles ON users USING GIN (roles jsonb_path_ops);

-- 添加注释说明(便于团队协作和文档生成)
COMMENT ON COLUMN users.id IS '用户ID,自增主键,对应 Java Long';
COMMENT ON COLUMN users.username IS '用户名,唯一,对应 Java String';
COMMENT ON COLUMN users.password_hash IS '密码哈希值,对应 Java String';
COMMENT ON COLUMN users.email IS '邮箱地址,唯一,对应 Java String';
COMMENT ON COLUMN users.full_name IS '真实姓名,可为空,对应 Java String';
COMMENT ON COLUMN users.age IS '年龄,0~150,对应 Java Short';
COMMENT ON COLUMN users.gender IS '性别,TRUE=男,FALSE=女,对应 Java Boolean';
COMMENT ON COLUMN users.balance IS '账户余额,精确到分,对应 Java BigDecimal';
COMMENT ON COLUMN users.status IS '用户状态:0=禁用,1=启用,2=待审核,对应 Java Integer';
COMMENT ON COLUMN users.created_at IS '注册时间,UTC时区,对应 Java Instant';
COMMENT ON COLUMN users.last_login_at IS '最后登录时间,UTC时区,对应 Java Instant';
COMMENT ON COLUMN users.roles IS '用户角色数组,JSONB格式,对应 Java List<String>';
COMMENT ON COLUMN users.preferences IS '用户偏好设置,JSONB格式,对应 Java Map<String, Object>';
COMMENT ON COLUMN users.avatar_url IS '头像URL,对应 Java String';
COMMENT ON COLUMN users.is_deleted IS '软删除标记,对应 Java Boolean';
COMMENT ON COLUMN users.version IS '乐观锁版本号,对应 Java Integer';

-- 创建用户操作日志表(演示时间类型和 UUID 使用)
CREATE TABLE user_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 使用 UUID 作为分布式ID
    user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, -- 关联用户表
    action VARCHAR(50) NOT NULL, -- 操作类型,如 "login", "update_profile"
    ip_address INET, -- 使用 INET 类型存储 IP 地址(支持 IPv4/IPv6)
    user_agent TEXT, -- 浏览器信息
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -- 记录操作时间
);

-- 为日志表创建索引
CREATE INDEX idx_user_logs_user_id ON user_logs (user_id);
CREATE INDEX idx_user_logs_created_at ON user_logs (created_at DESC);

-- 添加注释
COMMENT ON COLUMN user_logs.id IS '日志ID,UUID类型,对应 Java UUID';
COMMENT ON COLUMN user_logs.user_id IS '关联用户ID,对应 Java Long';
COMMENT ON COLUMN user_logs.action IS '操作类型,对应 Java String';
COMMENT ON COLUMN user_logs.ip_address IS 'IP地址,INET类型,对应 Java InetAddress';
COMMENT ON COLUMN user_logs.user_agent IS '浏览器标识,对应 Java String';
COMMENT ON COLUMN user_logs.created_at IS '操作时间,UTC时区,对应 Java Instant';

-- 创建枚举类型示例(PostgreSQL 原生支持,但 Java 映射需注意)
-- 通常不推荐,因 Java 枚举不易映射,此处仅作演示
CREATE TYPE user_action_type AS ENUM ('LOGIN', 'LOGOUT', 'UPDATE_PROFILE', 'DELETE_ACCOUNT');

-- 可选:创建视图简化查询
CREATE VIEW active_users AS
SELECT 
    id,
    username,
    email,
    balance,
    created_at,
    last_login_at
FROM users 
WHERE status = 1 AND is_deleted = FALSE;

COMMENT ON VIEW active_users IS '活跃用户视图,过滤已禁用和已删除用户';

-- 插入示例数据(演示 Java 映射)
INSERT INTO users (username, password_hash, email, full_name, age, gender, balance, status, roles, preferences, avatar_url)
VALUES 
('alice', 'hash123', 'alice@example.com', '爱丽丝·张', 28, TRUE, 1000.50, 1, '["user", "editor"]', '{"theme": "light", "lang": "zh"}', 'https://example.com/avatar/alice.jpg'),
('bob', 'hash456', 'bob@example.com', '鲍勃·李', 35, FALSE, 5000.00, 1, '["user", "admin"]', '{"theme": "dark", "lang": "en"}', 'https://example.com/avatar/bob.jpg');

-- 插入日志示例
INSERT INTO user_logs (user_id, action, ip_address, user_agent, created_at)
VALUES 
(1, 'LOGIN', '192.168.1.1', 'Mozilla/5.0', NOW()),
(2, 'UPDATE_PROFILE', '2001:db8::1', 'Chrome/120.0', NOW());

-- 查询活跃用户并按注册时间排序
SELECT * FROM active_users ORDER BY created_at DESC LIMIT 10;

3.3 Java实体类映射示例

// User实体类
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;                            // BIGSERIAL
    
    @Column(name = "uuid", unique = true, nullable = false)
    private UUID uuid;                          // UUID
    
    @Column(name = "username", unique = true, nullable = false, length = 50)
    private String username;                    // VARCHAR(50)
    
    @Column(name = "email", unique = true, nullable = false, length = 255)
    private String email;                       // VARCHAR(255)
    
    @Enumerated(EnumType.STRING)
    @Column(name = "role", nullable = false)
    private UserRole role;                      // user_role ENUM
    
    @Column(name = "date_of_birth")
    private LocalDate dateOfBirth;              // DATE
    
    @Column(name = "is_active")
    private Boolean isActive = true;            // BOOLEAN
    
    @Column(name = "created_at")
    private Instant createdAt;                  // TIMESTAMPTZ
    
    @Column(name = "metadata", columnDefinition = "jsonb")
    private String metadata;                    // JSONB
}

// Order实体类
@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;                            // BIGSERIAL
    
    @Column(name = "order_number", unique = true, nullable = false, length = 50)
    private String orderNumber;                 // VARCHAR(50)
    
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;                          // BIGINT (外键)
    
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private OrderStatus status;                 // order_status ENUM
    
    @Column(name = "total_amount", precision = 12, scale = 2)
    private BigDecimal totalAmount;             // NUMERIC(12,2)
    
    @Column(name = "ordered_at")
    private Instant orderedAt;                  // TIMESTAMPTZ
    
    @Column(name = "shipping_address", columnDefinition = "jsonb")
    private String shippingAddress;             // JSONB
}

四、性能优化建议

4.1 数据类型选择技巧

  1. 整数类型选择:

    • 小范围用 SMALLINT,常规用 INTEGER,大数值用 BIGINT
    • 主键推荐使用 BIGSERIAL/BIGINT
  2. 小数类型选择:

    • 金额等精确计算用 NUMERIC
    • 科学计算用 DOUBLE PRECISION
  3. 字符串类型选择:

    • 固定长度用 CHAR(n)
    • 可变长度用 VARCHAR(n)
    • 大文本用 TEXT
  4. JSON存储选择:

    • 优先使用 JSONB(支持索引、查询更快)

4.2 避免的陷阱

  1. 不要过度使用TEXT:有明确长度限制的应用VARCHAR(n)
  2. 时间戳选择:需要时区信息的使用 TIMESTAMPTZ
  3. 枚举处理:频繁变更的枚举使用VARCHAR,固定的使用PostgreSQL ENUM
  4. 数组使用:适度使用数组类型,避免过度规范化

五、总结

合理的PostgreSQL字段类型选择直接影响系统的:

  • 存储效率:减少磁盘占用
  • 查询性能:优化索引效果
  • 代码清晰度:明确的Java类型映射
  • 维护成本:减少后期重构

通过本文的实践指南,可以在项目初期建立良好的数据库设计基础,为后续的系统扩展和维护打下坚实基础。

PostgreSQL 选择数据库:深入解析与最佳实践 PostgreSQL是一款遵循SQL标准的开源关系型数据库管理系统。它由PostgreSQL Global Development Group维护,并拥有一个庞大的社区。遵循SQL标准:PostgreSQL严格遵循SQL标准,支持多种SQL特性,如窗口函数、CTE(公用表表达式)等。高度可扩展性:PostgreSQL支持多种数据类型,包括JSON、数组等,可以满足各种业务需求。高性能:PostgreSQL在性能方面表现优异,支持并发访问,适用于大规模数据应用。稳定性。 阅读详情

相关推荐

【Java与PostgreSQL数据库连接实战指南】——从零掌握JDBC编程技巧

随着开源技术的发展,PostgreSQL 凭借其强大的功能、良好的扩展性以及对复杂查询的支持,逐渐成为许多企业系统的重要数据库选择。它支持 JSON、空间数据、全文检索等多种高级特性,适用于金融、地理信息、大数据分析等领域。本文将带你一步步掌握如何使用 Java 通过 JDBC 技术连接 PostgreSQL 数据库,并进行实际开发演示。无论你是刚入门的新手还是有一定经验的开发者,都能找到实用内容。📌。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1774

PostgreSQL字段类型说明

PostgreSQL字段类型说明已有 817 次阅读  2009-02-25 22:49   标签:  PostgreSQL  字段  类型  BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节。BIT 固定长度的位串。BIT VARYING(n)VARBI

cyuyan的专栏 1万+

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口Java

本篇教程的Java程序中开始使用PostgreSQL之前,需要确保在计算机上设置了PostgreSQL JDBC和Java。您可以检查Java教程以在计算机上安装Java。现在让本篇教程检查如何设置PostgreSQL JDBC驱动程序。

No8g攻城狮的博客 1753

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型,以下是 PostgreSQL 13 版本中支持的所有字段类型:

yhj198927的博客 4428

《PostgreSQL开发指南》第30篇 Java访问PostgreSQL

介绍如何在 Java 程序中利用 JDBC 接口连接和操作 PostgreSQL 数据库,包括创建和删除表、执行数据的增删改查操作、事务的管理以及调用存储过程。

Tony.Dong的专栏 4486

Delphi中使用FireDAC与uniDAC高效连接PostgreSQL的实战指南

本文为Delphi开发者提供了使用FireDAC与uniDAC组件高效连接PostgreSQL数据库的实战指南。文章详细对比了两款组件的选择策略,重点解析了驱动依赖(libpq.dll)的配置、连接参数设置、常见错误排查及性能优化技巧,旨在帮助开发者快速构建稳定可靠的数据库连接。

tomato的博客 805

PostgreSQL(五)常用数据类型

PostgreSQL 常用数据类型

ACGkaka的博客 9342

封神台靶场,为了小芳,冲之——cookie注入

第二个靶场 打开网站 找一下注入点 一般在新闻这种里面点开看看 先判断是否存在注入 有waf 尝试了很多方法绕过都没成功,/and/,aandnd,AnD等一系列都没绕过去,乌鸡鲅鱼 删掉id=169 发现 然后判断cookie注入 在搜索框输入 Javascript:alert(document.cookie=”id=”+escape(‘169’)); 然后弹窗了(其中 “id=” 取决URL中的id= escape中的数值也是URL中id=的值)返回刚刚的页面,把ID删除后一样能正常显示。说明服务器能

Wubuqing的博客 650

PostgreSQL 常用数据类型介绍

一、数值类型:    下面是PostgreSQL所支持的数值类型的列表和简单说明:名字存储空间描述范围smallint2 字节小范围整数-32768 到 +32767integer4 字节常用的整数-2147483648 到 +2147483647bigint8 字节大范围的整数-9223372036854775808 到 9223372036854775807decimal变长用户声明精度,精确...

ningyuanhuo的专栏 3672

Origin绘制带差异显著性标记的分组均值条形图|科研论文图表教程(附数据格式模板)

传统柱状图虽能呈现组间均值差异,却隐藏个体数据分布;散点图虽能展示原始数据,却难以直观凸显统计显著性。带差异显著性(*)的分组均值条形图——它以“双层叙事”的创新设计,同时呈现群体特征与个体差异。

weixin_50236590的博客 1492

永磁同步电机功率计算实战:从公式到避坑指南(附Excel计算模板)

本文详细解析永磁同步电机(PMSM)功率计算的实战技巧,涵盖三维参数体系、三相与单相系统差异、动态工况补偿及常见计算陷阱。特别提供Excel计算模板,帮助工程师快速准确完成功率计算,避免工业应用中的常见错误,提升工作效率。

x8y9z0的博客 801

pgslq表的字段类型_表字段数据类型

表完整性约束创建表的完整语法create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件],字段名3 类型[(宽度) 约束条件]);注意事项:在同一表中,字段名不能相同。字段名和类型必须,宽度约束条件可选。最后一个字段不能加逗号。表中的数据类型介绍存储引擎决定了表的类型,表里面的数据也得有类型,数据还得有宽度,宽度是可选的。别问,问就是记。建表的时候,字...

weixin_39696665的博客 404

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

为了解决CIoU的问题,有学者在CIOU的基础上将纵横比拆开,提出了EIOU Loss,并且加入Focal聚焦优质的预测框,与CIoU相似的,EIoU是损失函数的解决方案,只用于训练。在错误率小的地方,梯度的值也应当小,反之在错误率大的地方,梯度也应当大,因为这时候我们需要对错误率小的情况进行微调,而错误率大的地方进行大刀阔斧的调整;如下图所示,三种情况IoU都相等,但看得出来他们的重合度是不一样的,左边的图回归的效果最好,右边的最差。DIoU的作者考虑到,在两个框中心点重合时,c与d的值都不变。

zyw2002的博客 6626

PostgreSQL 字段类型选择最佳实践指南(Java 后端开发视角)

项目推荐做法🔢 数值金额必须使用,禁止DOUBLE📅 时间字段优先使用Instant🔤 字符串优先使用TEXT或VARCHAR(n),避免CHAR🔢 主键🔗 唯一标识外部用UUID,配合🧩 动态字段使用JSONB+ GIN 索引🏷️ 枚举使用 PostgreSQLENUM类型提升一致性🔍 查询优化合理建立唯一索引、部分索引、GIN 索引📝 可维护性添加COMMENT注释,增强文档性🔄 软删除使用标记,配合索引过滤。

python15397的博客 563

MATLAB实战:利用扫频数据重构系统伯德图的关键步骤

本文详细介绍了如何利用MATLAB处理扫频数据并重构系统伯德图的完整实战流程。内容涵盖数据导入与清洗、增益与相位的精确计算、频率响应数据对象(frd)的构建、数据平滑与插值处理,以及最终生成专业伯德图并进行关键参数(如相位裕度)标注的方法。文章重点解决了从实测“黑盒子”系统数据出发,获取直观频率响应特性曲线的核心问题,为控制系统分析与设计提供了实用指南。

weixin_29098117的博客 396

mapbox高阶,加载倾斜摄影

本文详细介绍如何基于mapbox-gl v3.8.0版本实现倾斜摄影的加载,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 342

PostgreSQL - 常用数据类型选择与使用规范

PostgreSQL 常用数据类型选择与使用规范 PostgreSQL 提供丰富的数据类型支持,合理选择数据类型对数据库性能和数据完整性至关重要。本文总结了 PostgreSQL 核心数据类型的特性和选择指南: 数值类型: 整数类型:SMALLINT(2字节)、INTEGER(4字节)、BIGINT(8字节)根据数值范围选择 浮点数:REAL(4字节)和DOUBLE PRECISION(8字节)适用于科学计算 精确小数:DECIMAL/NUMERIC适合财务计算,可指定精度和小数位 文本类型: VARCHA

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

JSON 与 JSON-RPC 的区别

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于文本,采用人类可读的语法来表示结构化数据。它起源于JavaScript,但如今已被几乎所有主流编程语言支持。标准文档:RFC 4627数据类型:支持 String、Number、Boolean、Null、Object、Array 六种基本类型格式示例"name": "张三","age": 30,JSON-RPC(JSON Remote Procedure Call)是一种远程过程调用(RPC)协议。

h a 6 6 6 c k 为 你解决复杂难题! 144

PostgreSQL中指定精确小数字段类型

在Java中使用BigDecimal类进行精确计算。在PostgreSQL中,也有相对应的字段类型:现在需要使用NUMERIC类型来对应Java中的BigDecimal数据。

fxtxz2的专栏 639

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JDBC PostgreSQL 连接 URL 参数详解指南(适用于 Java 后端开发者)

本文是一份针对Java后端开发者的PostgreSQL JDBC连接URL参数详解指南。主要内容包括: 连接URL基本结构:jdbc:postgresql://host:port/database?参数 六大类核心参数: 基础连接参数(host,port等) 编码参数(client_encoding等) 安全参数(sslmode,ssl证书等) 性能参数(超时,批量处理等) 时区参数(timezone) 高级参数(事务,日志等) 重点推荐: 生产环境必须启用SSL(verify-full) 显式设置时区避免

python15397的博客 2784

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

项目从 MySQL 切换 PostgreSQL,Java干货

4、mysql一般用tinyint类型和java的Boolean字段对应并且在查询和更新时支持自动转换,但是postgres是强类型不支持,如果想无缝迁移postgres内部就新增自动转换的隐式函数,但是缺点是每次部署postgres后都要去执行一次脚本。这个可以说是最坑的, 因为mysql是支持自动类型转换的。如果不想这样,只能修改代码的所有表对象的字段类型和传参类型保证与postgres数据库的字段类型对应,但是有些依赖的框架底层自己操作数据库可能就无法修改源码了,只能修改数据库表字段类型了。

weixin_45585172的博客 986

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

PostgreSQL向量库pgvector实战指南

Entity@Id// OpenAI嵌入向量(1536维)// 原生SQL实现余弦相似度查询@Param("embedding") String embedding, // 向量字符串如"[0.1,0.2,...]"pgvector作为PostgreSQL的向量扩展,为Java开发者提供了一条低门槛集成AI能力的路径。生态复用:直接使用现有PostgreSQL基础设施,无需额外管理向量数据库开发便捷:通过Spring Data、JPA等熟悉的API即可操作向量数据企业级特性。

果果 5240

JPA 连接 PostgreSQL 数据库完全指南

本指南带你从零开始掌握企业级数据库开发技能。通过 Spring Boot 3.2+ 最新框架,手把手教你构建完整的数据库应用:环境搭建、依赖配置、实体设计、Repository 实现、服务层架构、连接池优化,每个知识点都配有详细代码示例。无论你是 Java 新手还是资深开发者,都能快速上手,让你的应用与 PostgreSQL 数据库无缝集成!💪 跟着我们的步伐,成为真正的全栈开发高手!🎯

郑恩赐,厦门工学院软件工程AI方向本科在读。专注AI全栈应用开发,熟练Vue3、Spring Boot、PyTorch等技术栈,正在探索多模态大模型应用。拥有多个全栈项目和AI应用开发经验,获国家级大创立项和发明专利,掘金优质作者榜第2名。 1019

PostgreSQL 字段类型速查与 Java 枚举映射

【代码】PostgreSQL 字段类型速查与 Java 枚举映射。

Vic10101的博客 390

PostgreSQL JDBC驱动:Java连接PostgreSQL数据库的终极指南

PostgreSQL JDBC驱动是Java开发者连接PostgreSQL数据库的官方标准解决方案,提供了高性能、稳定可靠的数据访问能力。这款纯Java编写的Type 4驱动程序通过PostgreSQL原生网络协议实现通信,让Java应用程序能够轻松地与PostgreSQL数据库进行交互。 ## 项目概述与核心技术 PostgreSQL JDBC驱动基于标准的JDBC API规范开发,完全兼容

gitblog_00738的博客 362

PostgreSQL 数据库选择指南

PostgreSQL,作为一款开源的对象-关系型数据库管理系统,以其稳定性、功能丰富性和强大的扩展能力而闻名。在选择数据库时,PostgreSQL常常是企业和开发者的首选之一。本文将详细介绍PostgreSQL的特点、优势以及选择数据库时应考虑的因素,帮助您做出明智的决策。

xyq2024的博客 537
上一篇: 私有方法单元测试全面指南
下一篇: PostgreSQL 字段类型选择最佳实践指南(Java 后端开发视角)
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值