mysql创建函数失败的解决

创建时异常日志:

Error Code: 1418
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

 

度娘了解决方案:

 

解决方法如下:
1. mysql> set global log_bin_trust_function_creators = 1;
2. 系统启动时 --log-bin-trust-function-creators=1
3. 在my.ini(linux下为my.conf)文件中 [mysqld] 标记后加一行内容为 log-bin-trust-function-creators=1 抄自度娘 https://zhidao.baidu.com/question/460606488.html
<think>好的,用户遇到了从达梦数据库迁移到MySQL创建失败的问题,需要解决方案。首先,我需要根据提供的引用内容分析可能的原因。引用中提到了字段类型不兼容、字段注释缺失、字符串长度问题等。这些都是迁移时常见的障碍。 首先考虑字段类型问题。达梦和MySQL的字段类型可能不完全对应,比如达梦的VARCHAR2在MySQL是VARCHAR,但可能有不同的限制。用户需要检查表结构,逐一对比类型是否兼容。例如,达梦的CLOB可能需要转换成MySQL的LONGTEXT。此外,自增列的处理也不同,达梦用IDENTITY,而MySQL用AUTO_INCREMENT,这里可能需要修改建表语句。 然后是字符串长度问题。引用3提到达梦迁移后出现varchar字段超长,尽管长度设置一致。这可能与字符编码有关,比如UTF8在MySQL中每个字符占用3字节,而达梦可能按字符数计算。需要检查MySQL的varchar长度是否超过字节限制,必要时调整字段长度或使用更合适的类型。 约束和索引的差异也是问题源。达梦可能支持不同的约束名称或索引类型,而MySQL有长度限制,例如索引名最长64字符。此外,外键约束的语法可能不同,需要调整。 字段注释缺失的问题在引用2中提到,虽然注释不影响建表,但若迁移工具处理不当,可能需要手动导出注释并添加到MySQL表里。 接下来是处理方案。用户需要获取达梦的表结构DDL,使用迁移工具或导出脚本,然后逐项检查类型转换。可能需要手动修改建表语句中的字段类型、调整字符串长度、修改自增列定义,以及处理约束和索引名称。此外,测试迁移后的表结构,确保数据能正确插入,并处理字符集和排序规则问题。 最后,用户可能需要分步操作,如导出结构、对比修改、执行建表,并验证结果。同时,提供示例和注意事项,帮助用户避免常见错误,如忽略默认值或字符集设置。总结来说,关键在于详细分析错误日志,针对性调整表结构,确保兼容性。</think>### 达梦数据库迁移至MySQL创建失败解决方案 #### **常见原因分析** 1. **字段类型不兼容** 达梦数据库MySQL的字段类型存在差异,例如: - 达梦的 `VARCHAR2` 需改为MySQL的 `VARCHAR`,且需注意字符长度限制(如UTF8编码下MySQL单字段最大为$21845$字符)[^3][^4]。 - 达梦的 `CLOB` 类型需改为MySQL的 `LONGTEXT`。 - 达梦的 `NUMBER` 类型需根据实际精度调整为MySQL的 `DECIMAL` 或 `INT`。 2. **自增列语法差异** 达梦使用 `IDENTITY(1,1)` 定义自增列,而MySQL需使用 `AUTO_INCREMENT`,例如: ```sql -- 达梦语法 CREATE TABLE demo (id INT IDENTITY(1,1)); -- MySQL语法 CREATE TABLE demo (id INT AUTO_INCREMENT PRIMARY KEY); ``` 3. **字符串长度超限** 达梦的 `VARCHAR` 字段长度按字符数计算,而MySQL按字节计算。若使用UTF8编码,实际存储长度可能超过MySQL限制(如 `VARCHAR(255)` 占用$765$字节),需调整字段长度或改用 `TEXT` 类型。 4. **约束或索引冲突** - 达梦允许更长的约束名(如外键名),而MySQL约束名限制为$64$字符[^2]。 - 达梦的某些索引类型(如位图索引)在MySQL中不支持,需替换为普通索引。 --- #### **具体解决方案** 1. **获取达梦表结构并转换** 使用达梦的 `DTS工具` 导出表结构脚本,或手动执行以下SQL生成DDL: ```sql -- 达梦语法 SELECT DBMS_METADATA.GET_DDL('TABLE', '表名') FROM DUAL; ``` 2. **逐步修改字段类型** | 达梦字段类型 | MySQL对应类型 | 注意事项 | |----------------------|------------------------|-----------------------------------| | `VARCHAR2(n)` | `VARCHAR(n)` | 检查编码导致的字节超限问题 | | `NUMBER(p,s)` | `DECIMAL(p,s)` | 确保精度和小数位一致 | | `TIMESTAMP` | `DATETIME` | 处理默认值格式差异 | 3. **处理自增列与主键** 修改达梦的 `IDENTITY` 为MySQL的 `AUTO_INCREMENT`,并显式定义主键: ```sql -- 修改前(达梦) CREATE TABLE test (id INT IDENTITY(1,1), name VARCHAR(50)); -- 修改后(MySQL) CREATE TABLE test ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); ``` 4. **调整约束与索引** - 缩短约束名称至64字符内,例如将 `fk_long_constraint_name` 改为 `fk_short_name`。 - 删除MySQL不支持的索引类型,改用 `BTREE` 索引。 5. **验证并执行建表语句** 使用分步验证法: ```sql -- 步骤1:仅创建表结构(无约束) CREATE TABLE test (...); -- 步骤2:逐个添加约束 ALTER TABLE test ADD CONSTRAINT ...; ``` --- #### **操作示例** **达梦原始DDL**: ```sql CREATE TABLE "USER" ( "ID" NUMBER(10) IDENTITY(1,1), "NAME" VARCHAR2(50), "DESC" CLOB ); ``` **转换后MySQL DDL**: ```sql CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), `desc` LONGTEXT ) DEFAULT CHARSET=utf8mb4; ``` --- #### **注意事项** 1. **字符集与排序规则** 统一设置为 `utf8mb4` 和 `utf8mb4_general_ci`,避免中文乱码。 2. **默认值处理** 达梦的默认值可能包含MySQL不支持函数(如 `SYSDATE`),需改为 `CURRENT_TIMESTAMP`。 3. **错误日志分析** 若仍失败,检查MySQL错误日志(默认路径:`/var/log/mysql/error.log`),定位具体报错行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值