时间:2021-05-24
使用数据库postgresql的时候,有时会遇到字段长度扩展的情况,由于之前已经有数据了,所以只能修改字段长度,不能通过删除再增加的方式。
可以使用如下方式进行
ALTER TABLE your_table_name alter COLUMN your_column_name type character varying(3000);通过上面的一句话就可以把你的表中相应的字段的长度修改为3000.
补充:PostgreSQL字符类型长度变更的性能
业务有时会遇到表中的字符型字段的长度不够用的问题,需要修改表定义。但是表里的数据已经很多了,修改字段长度会不会造成应用堵塞呢?
做了个小测试,如下
建表并插入1000w数据
postgres=# create table tbx1(id int,c1 char(10),c2 varchar(10));CREATE TABLEpostgres=# insert into tbx1 select id ,'aaaaa','aaaaa' from generate_series(1,10000000) id;INSERT 0 10000000变更varchar类型长度
postgres=# alter table tbx1 alter COLUMN c2 type varchar(100);ALTER TABLETime: 1.873 mspostgres=# alter table tbx1 alter COLUMN c2 type varchar(99);ALTER TABLETime: 12815.678 mspostgres=# alter table tbx1 alter COLUMN c2 type varchar(4);ERROR: value too long for type character varying(4)Time: 5.328 ms变更char类型长度
postgres=# alter table tbx1 alter COLUMN c1 type char(100);ALTER TABLETime: 35429.282 mspostgres=# alter table tbx1 alter COLUMN c1 type char(6);ALTER TABLETime: 20004.198 mspostgres=# alter table tbx1 alter COLUMN c1 type char(4);ERROR: value too long for type character(4)Time: 4.671 ms变更char类型,varchar和text类型互转
alter table tbx1 alter COLUMN c1 type varchar(6);ALTER TABLETime: 18880.369 mspostgres=# alter table tbx1 alter COLUMN c1 type text;ALTER TABLETime: 12.691 mspostgres=# alter table tbx1 alter COLUMN c1 type varchar(20);ALTER TABLETime: 32846.016 mspostgres=# alter table tbx1 alter COLUMN c1 type char(20);ALTER TABLETime: 39796.784 mspostgres=# alter table tbx1 alter COLUMN c1 type text;ALTER TABLETime: 32091.025 mspostgres=# alter table tbx1 alter COLUMN c1 type char(20);ALTER TABLETime: 26031.344 ms定义变更后,数据位置未变,即没有产生新的tuple
postgres=# select ctid,id from tbx1 limit 5; ctid | id -------+---- (0,1) | 1 (0,2) | 2 (0,3) | 3 (0,4) | 4 (0,5) | 5(5 rows)除varchar扩容以外的定义变更,每个tuple产生一条WAL记录
$ pg_xlogdump -f -s 3/BE002088 -n 5rmgr: Heap len (rec/tot): 3/ 181, tx: 1733, lsn: 3/BE002088, prev 3/BE001FB8, desc: INSERT off 38, blkref #0: rel 1663/13269/16823 blk 58358rmgr: Heap len (rec/tot): 3/ 181, tx: 1733, lsn: 3/BE002140, prev 3/BE002088, desc: INSERT off 39, blkref #0: rel 1663/13269/16823 blk 58358rmgr: Heap len (rec/tot): 3/ 181, tx: 1733, lsn: 3/BE0021F8, prev 3/BE002140, desc: INSERT off 40, blkref #0: rel 1663/13269/16823 blk 58358rmgr: Heap len (rec/tot): 3/ 181, tx: 1733, lsn: 3/BE0022B0, prev 3/BE0021F8, desc: INSERT off 41, blkref #0: rel 1663/13269/16823 blk 58358rmgr: Heap len (rec/tot): 3/ 181, tx: 1733, lsn: 3/BE002368, prev 3/BE0022B0, desc: INSERT off 42, blkref #0: rel 1663/13269/16823 blk 58358varchar扩容,varchar转text只需修改元数据,毫秒完成。
其它转换需要的时间和数据量有关,1000w数据10~40秒,但是不改变数据文件,只是做检查。
缩容时如果定义长度不够容纳现有数据报错
不建议使用char类型,除了埋坑几乎没什么用,这一条不仅适用与PG,所有关系数据库应该都适用。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
索引字段长度太长,1.修改字段长度2.修改mysql默认的存储引擎在/etc/mysql/my.cnf的[mysqld]下面加入default-storage-
暴字段长度Orderbynum/*匹配字段and1=1unionselect1,2,3,4,5…….n/*暴字段位置and1=2unionselect1,2,3
PostgreSql数据库中varchar类型与sqlserver中字段用法有差别,PostgreSql中如果字段设置为varchar类型长度为10,则无论存字
暴字段长度Orderbynum/*匹配字段and1=1unionselect1,2,3,4,5…….n/*暴字段位置and1=2un
本文实例总结了PHP常见的几种攻击方式。分享给大家供大家参考,具体如下:1.SQLInjection(sql注入)①.暴字段长度Orderbynum/*②.匹配