避开选型陷阱:工程师必读的数据采集卡采样率与分辨率权衡指南
2026/6/22 11:25:20
据说 如果你熟悉 MySQL,切换到 PostgreSQL 就像从 Windows 切换到 macOS:都是电脑,比较简单,
但是 但操作习惯不同。
老是不习惯 写篇文章对比一下吧 给其他小伙伴
# 连接数据库mysql -u root -p# 进入后mysql>SHOW DATABASES;mysql>USE database_name;mysql>SHOW TABLES;# 连接数据库psql -U postgres -d database_name# 进入后postgres=# \l -- 相当于 SHOW DATABASESpostgres=# \c database_name -- 相当于 USE database_namepostgres=# \dt -- 相当于 SHOW TABLES| 操作 | MySQL | PostgreSQL | 解释 |
|---|---|---|---|
| 查看所有数据库 | SHOW DATABASES; | \l | PostgreSQL 用反斜杠命令 |
| 使用数据库 | USE dbname; | \c dbname | 切换当前数据库 |
| 查看所有表 | SHOW TABLES; | \dt | 注意:是\dt不是/dt |
| 查看表结构 | DESC table_name; | \d table_name | PostgreSQL 的\d更强大 |
| 查看表详情 | SHOW CREATE TABLE table_name; | \d+ table_name | 显示索引、约束等 |
| 退出客户端 | exit;或quit; | \q | 简单一个字母 |
| 执行SQL文件 | source file.sql; | \i file.sql | 导入外部SQL |
| 查看帮助 | help; | \? | 元命令帮助 |
-- MySQLSELECT*FROMuserLIMIT10;-- PostgreSQLSELECT*FROM"user"LIMIT10;-- 或更标准的SELECT*FROM"user"FETCHFIRST10ROWSONLY;-- MySQLCREATETABLEuser(idINTAUTO_INCREMENTPRIMARYKEY);-- PostgreSQLCREATETABLE"user"(idSERIALPRIMARYKEY);-- 或(现代方式)CREATETABLE"user"(idINTGENERATED ALWAYSASIDENTITYPRIMARYKEY);-- MySQLSELECTCONCAT(name,' (',phone,')')FROMuser;-- PostgreSQLSELECTname||' ('||phone||')'FROM"user";-- 或SELECTCONCAT(name,' (',phone,')')FROM"user";-- MySQLSELECTNOW();-- 2025-01-15 10:30:00SELECTCURDATE();-- 2025-01-15-- PostgreSQLSELECTNOW();-- 2025-01-15 10:30:00.123456+08SELECTCURRENT_DATE;-- 2025-01-15 (注意:没有括号)-- MySQLCREATETABLEuser(idVARCHAR(20)PRIMARYKEY,phoneVARCHAR(15)UNIQUENOTNULL,passwordVARCHAR(128),nameVARCHAR(50),ageINT,created_atBIGINTDEFAULTUNIX_TIMESTAMP(),updated_atBIGINTDEFAULTUNIX_TIMESTAMP()ONUPDATEUNIX_TIMESTAMP());-- PostgreSQLCREATETABLE"user"(idVARCHAR(20)PRIMARYKEY,phoneVARCHAR(15)UNIQUENOTNULL,passwordVARCHAR(128),nameVARCHAR(50),ageINT,created_atBIGINTDEFAULTEXTRACT(EPOCHFROMNOW()),updated_atBIGINTDEFAULTEXTRACT(EPOCHFROMNOW()));-- PostgreSQL 需要创建触发器来更新 updated_atCREATEORREPLACEFUNCTIONupdate_updated_at_column()RETURNSTRIGGERAS$$BEGINNEW.updated_at=EXTRACT(EPOCHFROMNOW());RETURNNEW;END;$$language'plpgsql';CREATETRIGGERupdate_user_updated_at BEFOREUPDATEON"user"FOR EACH ROWEXECUTEFUNCTIONupdate_updated_at_column();-- 两者通用(PostgreSQL 表名需要引号)SELECT*FROM"user"WHEREphone='13634759152';-- 时间戳转换(PostgreSQL 更强大)-- MySQLSELECTFROM_UNIXTIME(created_at)FROMuser;-- PostgreSQLSELECTTO_TIMESTAMP(created_at)FROM"user";SELECTcreated_at*INTERVAL'1 second'FROM"user";连接字符串:
# MySQL"mysql+pymysql://user:pass@localhost/db"# PostgreSQL"postgresql+psycopg2://user:pass@localhost/db"ORM配置:
# SQLAlchemy 中# MySQL 可以用 AUTO_INCREMENT# PostgreSQL 用 SERIAL 或 IDENTITY备份恢复:
# MySQLmysqldump -u root db>backup.sql mysql -u root db<backup.sql# PostgreSQLpg_dump -U postgres db>backup.sql psql -U postgres db<backup.sql权限管理:PostgreSQL 更细粒度,也更复杂 但是主流推荐
"User",查询必须用引号\dt✓,/dt✗;,但 PostgreSQL 的元命令不用把 PostgreSQL 当成一个全新的数据库来学,不要尝试把 MySQL 的习惯带过去。掌握\开头的元命令,理解严格的大小写和类型系统,你会发现 PostgreSQL 的强大之处。
据说:如果你用 Docker,两者的差异会更明显。PostgreSQL 的数据卷需要正确配置权限,而 MySQL 通常 “just works”。