今天下發了個新內容
實現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%';