PDManer生成Oracle表结构时修改字段长度为原先3倍

一、问题分析,MySQL与Oracle字符编码差异导致的数据迁移问题

当MySQL与Oracle字段长度定义相同时,实际存储的字符长度可能出现不匹配的情况,这主要是由于:

字符编码差异:

  • MySQL中一个汉字在UTF-8编码下通常占3个字节

  • Oracle中一个汉字在AL32UTF8(UTF-8)编码下也是3个字节,但在ZHS16GBK编码下只占2个字节

长度语义差异:

  • MySQL的VARCHAR(n)表示字符数

  • Oracle的VARCHAR2(n)在默认情况下表示字节数(除非使用CHAR语义)

二、打开PDManer,修改生成Oracle建表语句的模板代码,使字段长度为原先定义的3倍

CREATE TABLE {{=it.entity.defKey}}(
{{ pkList = [] ; }}
{{~it.entity.fields:field:index}}
    {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}
    {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.type === "VARCHAR2" ? (field.len*3 > 4000 ? 4000 : field.len*3) : field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}
{{~}}
{{? pkList.length >0 }}
    PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i<pkList.length-1 ? ',' : '' }}{{~}})
{{?}}
);
$blankline
{{? it.entity.defKey || it.entity.defName}}COMMENT ON TABLE {{=it.entity.defKey}} IS '{{=it.func.join(it.entity.defName,it.entity.comment,';')}}';{{?}}
{{~it.entity.fields:field:index}}
{{? field.defName || field.comment}}COMMENT ON COLUMN {{=it.entity.defKey}}.{{=field.defKey}} IS '{{=it.func.join(field.defName,field.comment,';')}}';{{?}}
{{~}}
posted @ 2025-04-03 17:47  LittleDuo  阅读(31)  评论(0)    收藏  举报