GaussDB数据类型详解:从基础到高级应用(下)
四、类型转换与优化
- 显式类型转换
-- 数值转字符串
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);
五、典型错误规避
- 隐式类型转换陷阱
-- 错误示例:字符串与数值比较
SELECT * FROM employees
WHERE department = 'IT' AND 'Sales' = 10; -- 隐式转换导致意外结果
-- 正确做法:显式类型匹配
WHERE department = 'IT' AND sales_target = 10;
- 时区处理错误
-- 错误时间存储(未指定时区)
INSERT INTO events (event_time) VALUES ('2023-10-01 12:00:00');
-- 正确做法:使用TIMESTAMPTZ
INSERT INTO events (event_time) VALUES (NOW());
六、实战技巧
- 枚举类型应用
-- 创建枚举类型
CREATE TYPE order_status AS ENUM (
'CREATED', 'PAID', 'SHIPPED', 'COMPLETED'
);
-- 使用枚举字段
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
status ORDER_STATUS DEFAULT 'CREATED'
);
- 自定义域(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数据类型优化指南》及华为云官方文档。