今天下发了个新内容

实现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%\';

版权声明:本文为wolf-shuai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wolf-shuai/p/12942882.html