You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过脚本修改SQLite数据库所有文本列的排序规则为RTRIM

批量修改SQLite文本列排序规则为RTRIM的方法

务必先备份你的SQLite数据库文件,防止操作失误导致数据丢失。

以下是用SQLite自带命令行工具实现的简便方法:

  • 生成修改脚本:打开终端/命令提示符,执行以下命令(替换your_db.sqlite为你的数据库文件名):
sqlite3 your_db.sqlite << 'EOF'
.mode tabs
.output alter_tables.sql
SELECT 
    'ALTER TABLE ' || tbl_name || ' RENAME TO ' || tbl_name || '_old;' || char(10) ||
    'CREATE TABLE ' || tbl_name || ' (' || 
    group_concat(
        case when type = 'TEXT' then 
            quote(name) || ' TEXT COLLATE RTRIM ' || 
            case when notnull = 1 then 'NOT NULL ' else '' end ||
            case when pk = 1 then 'PRIMARY KEY ' else '' end ||
            case when dflt_value is not null then 'DEFAULT ' || quote(dflt_value) || ' ' else '' end
        else
            quote(name) || ' ' || type || ' ' ||
            case when notnull = 1 then 'NOT NULL ' else '' end ||
            case when pk = 1 then 'PRIMARY KEY ' else '' end ||
            case when dflt_value is not null then 'DEFAULT ' || quote(dflt_value) || ' ' else '' end
        end,
        ', '
    ) || ');' || char(10) ||
    'INSERT INTO ' || tbl_name || ' SELECT * FROM ' || tbl_name || '_old;' || char(10) ||
    'DROP TABLE ' || tbl_name || '_old;' || char(10)
FROM 
    sqlite_master 
JOIN 
    pragma_table_info(tbl_name) 
WHERE 
    type = 'table' AND tbl_name NOT LIKE 'sqlite_%'
GROUP BY 
    tbl_name;
.quit
EOF
  • 检查脚本:打开生成的alter_tables.sql文件,确认所有表的修改语句符合预期——比如TEXT列都加上了COLLATE RTRIM,同时保留了原列的NOT NULL、主键、默认值等约束。

  • 执行脚本:运行以下命令完成修改:

sqlite3 your_db.sqlite < alter_tables.sql

额外处理(触发器/索引)

如果你的表包含触发器或索引,上述脚本不会自动迁移这些对象,需要额外生成重建语句:

  • 将以下SQL添加到生成脚本的查询中,可生成触发器和索引的重建语句:
-- 生成触发器重建语句
SELECT 'CREATE TRIGGER ' || name || ' ' || sql || ';' FROM sqlite_master WHERE type = 'trigger' AND tbl_name NOT LIKE 'sqlite_%';

-- 生成索引重建语句
SELECT 'CREATE ' || case when unique = 1 then 'UNIQUE ' else '' end || 'INDEX ' || name || ' ON ' || tbl_name || ' (' || substr(sql, instr(sql, '(')) || ');' FROM sqlite_master WHERE type = 'index' AND tbl_name NOT LIKE 'sqlite_%';

内容的提问来源于stack exchange,提问作者Bwmat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:01:00