GaussDB数据类型详解:从基础到高级应用(下)

58 阅读2分钟

四、类型转换与优化

  1. 显式类型转换 -- 数值转字符串 SELECT CAST(12345 AS VARCHAR(10)) AS str_value;

-- 日期格式化 SELECT TO_CHAR(TIMESTAMP '2023-10-01 14:30:00', 'YYYY-MM-DD HH24:MI:SS');

-- JSON解析 SELECT (details->>'price')::NUMERIC FROM products; 2. 性能优化建议 ​​存储优化​​

-- 使用适当精度(避免NUMERIC(38,0)存储普通整数)
CREATE TABLE orders (
    order_id BIGSERIAL,
    amount NUMERIC(10,2)  -- 足够存储99999999.99
);
​​索引策略​​
-- 在JSONB字段创建GIN索引
CREATE INDEX idx_product_specs ON product_catalog USING GIN (details jsonb_path_ops);

-- 空间数据GiST索引
CREATE INDEX idx_locations_geog ON locations USING GIST (geog);

五、典型错误规避

  1. 隐式类型转换陷阱
-- 错误示例:字符串与数值比较
SELECT * FROM employees 
WHERE department = 'IT' AND 'Sales' = 10;  -- 隐式转换导致意外结果

-- 正确做法:显式类型匹配
WHERE department = 'IT' AND sales_target = 10;
  1. 时区处理错误
-- 错误时间存储(未指定时区)
INSERT INTO events (event_time) VALUES ('2023-10-01 12:00:00');

-- 正确做法:使用TIMESTAMPTZ
INSERT INTO events (event_time) VALUES (NOW());

六、实战技巧

  1. 枚举类型应用
-- 创建枚举类型
CREATE TYPE order_status AS ENUM (
    'CREATED', 'PAID', 'SHIPPED', 'COMPLETED'
);

-- 使用枚举字段
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    status ORDER_STATUS DEFAULT 'CREATED'
);
  1. 自定义域(Domain) -- 创建带约束的域 CREATE DOMAIN percentage AS NUMERIC(5,2) CHECK (VALUE >= 0 AND VALUE <= 100);

-- 应用域约束 CREATE TABLE survey_results ( question_id INT, response percentage ); 总结 GaussDB丰富的数据类型体系为业务场景提供了灵活支持:

​​基础类型​​确保数据存储的精确性 ​​JSON/数组​​支持半结构化数据处理 ​​空间类型​​满足地理信息应用需求 ​​UUID/网络类型​​适配分布式系统 ​​最佳实践建议​​:

优先选择最小适用类型(如用SMALLINT替代INT) 对高频查询字段建立合适索引 使用显式类型转换避免隐式错误 定期分析表空间使用情况(使用pgstattuple扩展) 通过合理运用数据类型,可显著提升数据库性能并降低存储成本。更多高级用法请参考《GaussDB数据类型优化指南》及华为云官方文档。