• sql server转mysql数据导入


    今天下发了个新内容

    实现sql server  数据转 mysql数据

    我实现的方法是sql server数据转excel数据,然后在mysql的navacat 12中导入excel数据

    出现的问题:其中碰到主键重复和字段值长度太长和长度不符 数据内容消失

        在sql server中的longtext  是长文本相当于text但是在mysql中需要把长文本的数据类型改变成text

        但是改了还是会出错报1067错误,下面我们看看是什么原因:

    查阅资料得知,mysql5.7版本中有了一个STRICT mode(严格模式),而在此模式下默认是不允许设置日期的值为全0值的,所以想要

    sql_mode常用值

    ONLY_FULL_GROUP_BY

    对于GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,没有在GROUP BY中出现,那么这个SQL是不合法的。

    对于不合法的SQL语句,执行时会报如下错误

    ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'postscan.verifyDelayLog.auditor' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    NO_AUTO_VALUE_ON_ZERO

    该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,该列又是自增长的,那么这个选项就有用了。

    STRICT_TRANS_TABLES

    在该模式下,如果一个值不能插入到一个事物表中,则中断当前的操作,对非事物表不做限制

    NO_ZERO_IN_DATE
     

    在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。

    NO_ZERO_DATE
     

    在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。 

    ERROR_FOR_DIVISION_BY_ZERO
     

    在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL 

    NO_AUTO_CREATE_USER
     

    禁止GRANT创建密码为空的用户

    NO_ENGINE_SUBSTITUTION

    如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常  

    PIPES_AS_CONCAT

    将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

    ANSI_QUOTES

    启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

    解决这个问题,就需要修改sql_mode的值。

     大都问题都在于mysql5.7 版本中有了一个select mode(严格模式)最简单的方法就是设置sql_mode为空

    使用命令 select @@sql_mode; 可以查看sql_mode的值

    MySQL5.0以上版本支持三种sql_mode模式:ANSI、TRADITIONAL和STRICT_TRANS_TABLES。

    1、ANSI模式:宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。

    2、TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误,而不仅仅是警告。用于事物时,会进行事物的回滚。 注释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。

    3、STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。

    设置 sql_mode

    查看当前连接会话的sql模式:

    select @@session.sql_mode;

    或者从环境变量里取

    show variables like "sql_mode";

    查看全局sql_mode设置:

    select @@global.sql_mode;

    设置global,需要重新连接进来才会生效:

    set global sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE';

    设置全局sql_mode可以在不重启MySQL的情况下生效

    mysq'l安装路径下的配置文件里设置

    sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE

    或者在配置文件my.ini中修改sql_mode="";这样不执行sql_mode模式

    修改配置文件后,重启MySQL服务生效

    最后excel表中的数据导入mysql的时候最好把mysql表中的字段类型与Excel中的列的类型对应

    如果Excel导入数据中文乱码需要改变表和表中字段的字符集编码

    修改数据库字符集:

    ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];
    把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...]
    如:ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

    只是修改表的默认字符集:

    ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];
    如:ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    修改字段的字符集:

    ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...];
    如:ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;

    查看数据库编码:

    SHOW CREATE DATABASE db_name;

    查看表编码:

    SHOW CREATE TABLE tbl_name;

    查看字段编码:

    SHOW FULL COLUMNS FROM tbl_name;

    查看系统的编码字符

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
  • 相关阅读:
    Oracle EBS 初始化用户密码
    Oracle EBS FND User Info API
    linux ERROR: ld.so: object '/lib/libcwait.so' from /etc/ld.so.preload cannot be preloaded: ignored.
    linux解压cpio.gz类型文件
    linux删除乱码文件
    linux使用man命令后退出
    linux字符图形界面
    Red Hat linux 如何增加swap空间
    Linux删除文件夹命令
    Linux本地无法登录,远程却可以登录
  • 原文地址:https://www.cnblogs.com/wolf-shuai/p/12942882.html
Copyright © 2020-2023  润新知