INET_ATON()函數在MySQL5.6版本和5.7版本的差別

問題

### The error occurred while setting parameters
### SQL: insert into t_gateway(         gw_address,         type_name,         host_node_id,         port,         decoder_class,         handle_class,         sdk_file_path,         forward,         forward_host,         forward_port                   ,vip                   )         values(         ?,         ?,         ?,         ?,         ?,         ?,         ?,         ?,         ?,         ?                   ,INET_ATON(?)                   )
### Cause: java.sql.SQLException: Incorrect string value: '''' for function inet_aton
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1411]; Incorrect string value: '''' for function inet_aton; nested exception is java.sql.SQLException: Incorrect string value: '''' for function inet_aton
 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) ~[spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE]

 

分析

報的異常是inet_aton函數,不正確的參數‘’‘’,其實就是空字符串。通過在MySQL5.6上測試和5.7測試對比,截圖以下:java

MySQL5.6node

MySQL5.7spring

    能夠看出在5.6上無論用於select,insert inet_aton函數,當參數爲空字符串時,都能返回null,並正確處理。而在5.7版本上,當在執行select時inet_aton能返回null,可是在insert語句中報了錯,和我程序報的錯同樣。sql

至此能夠看出程序中報的錯就是由於MySQL5.六、5.7對inet_aton函數行爲差別致使的。也就是5.7對inet_aton函數的參數有了更強的校驗。編程

    可是5.7中,一樣是執行函數,爲何insert語句能拋出錯誤信息,可是select確能返回值null呢? 其實select中也報了一樣的異常,只是把異常看成warning了,當執行完select inet_aton('');後能夠看到下面有1 warning的字樣。能夠經過show warnings看到詳細的信息。函數

總結

   MySQL5.7 對inet_aton函數參數校驗更加嚴格,因此在編程的時候在執行SQL以前就需要對參數進行格式校驗,確保SQL語句執行不會拋異常。測試

相關文章
相關標籤/搜索