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%';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM