預設的sql_mode,即使值的長度超過欄位的定義,也能截斷資料插入
******************************************************MySQL 的第三個坑***************************************************************
預設模式,是非嚴格模式,插入的欄位比定義的欄位長會自動擷取,也不報錯,產生資料混亂。
root@test 09:13:09>select @@sql_mode;
+------------------------+
| @@sql_mode |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)
root@test 09:41:54>desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
root@test 09:46:28>insert into test values(12, '11111111111111111111111');
Query OK, 1 row affected, 1 warning (0.02 sec)
root@test 09:47:19>select * from test;
+------+------------+
| id | name |
+------+------------+
| 1 | aa11 |
| 2 | 1234 |
| 3 | Ab |
| 3 | ab |
| 12 | 1111111111 |
+------+------------+
2. 所以需要設定為traditional模式,意味著是傳統的資料庫模式,它的反應也是跟oracle和sql server 相同的處理方式。
root@test 09:46:53>set sql_mode='traditional,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
--欄位超長會報錯
root@test 09:47:15>insert into test values(12, '11111111111111111111111');
ERROR 1406 (22001): Data too long for column 'name' at row 1
所以我們的應用由傳統的資料庫oracle轉向mysql時, 最好配置sql_mode='traditional,NO_ENGINE_SUBSTITUTION', 這樣不會出現一些奇怪陌生的行為。
預設模式,是非嚴格模式,插入的欄位比定義的欄位長會自動擷取,也不報錯,產生資料混亂。
root@test 09:13:09>select @@sql_mode;
+------------------------+
| @@sql_mode |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)
root@test 09:41:54>desc test;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
root@test 09:46:28>insert into test values(12, '11111111111111111111111');
Query OK, 1 row affected, 1 warning (0.02 sec)
root@test 09:47:19>select * from test;
+------+------------+
| id | name |
+------+------------+
| 1 | aa11 |
| 2 | 1234 |
| 3 | Ab |
| 3 | ab |
| 12 | 1111111111 |
+------+------------+
2. 所以需要設定為traditional模式,意味著是傳統的資料庫模式,它的反應也是跟oracle和sql server 相同的處理方式。
root@test 09:46:53>set sql_mode='traditional,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
--欄位超長會報錯
root@test 09:47:15>insert into test values(12, '11111111111111111111111');
ERROR 1406 (22001): Data too long for column 'name' at row 1
所以我們的應用由傳統的資料庫oracle轉向mysql時, 最好配置sql_mode='traditional,NO_ENGINE_SUBSTITUTION', 這樣不會出現一些奇怪陌生的行為。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/674865/viewspace-2123709/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql設定欄位預設值SQL
- 建議欄位別名定義定義那裡順便可定義預設值,這預設值還可以是函式函式
- MySQL欄位預設值設定詳解MySql
- MySQL 如何儲存長度很長的資料欄位MySql
- mysql資料表插入資料後,獲取自增欄位值的方法MySql
- pydantic 欄位的預設值設定獲取當前時間
- golang通過反射設定結構體欄位的值Golang反射結構體
- SAP主資料的欄位長度(ECC6.0)
- [需求建議]建議欄位別名定義定義那裡順便可定義預設值,這預設值還可以是函式函式
- mysql的text欄位長度MySql
- Oracle varchar2型別欄位插入插入過長資料丟失問題Oracle型別
- jpa~為欄位新增insert的預設值
- MySQL修改欄位預設值MySql
- SharePoint 多行文字欄位設定預設值
- MySQL5.7中的sql_mode預設值MySql
- oracle 修改表欄位的長度Oracle
- 對錶中的欄位設定了預設值,新增記錄後卻發現該欄位為nullNull
- sqlloader匯入資料_資料檔案的欄位超出最大長度SQL
- Dynamics CRM 通過配置來設定查詢欄位的預設檢視
- 【COLUMN】設定表欄位預設值僅對未來生效
- oracle增加欄位帶預設值Oracle
- 查詢oracle欄位預設值Oracle
- MySQL中修改一個資料庫下包含有某個相同欄位的所有表的欄位長度MySql資料庫
- 觸發器—一個表插入資料時其他欄位同步自增長欄位觸發器
- oracle 資料庫設定表和欄位的別名Oracle資料庫
- mysql中sql_mode值設定MySql
- MySQL的欄位數量以及長度限制MySql
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- 關於有預設值的欄位在用EF做插入操作時的思考(續)
- SQL Server語句刪除帶有預設值的欄位SQLServer
- [MSSQL]以字元','分隔的欄位值,迴圈插入表中SQL字元
- MySQL-修改欄位型別、設定預設值,以及新增註釋MySql型別
- SQL SERVER 查詢表的欄位名、資料型別和最大長度SQLServer資料型別
- Sqlserver的欄位datetime型別預設值設為getdate()時,設值毫秒為000SQLServer型別
- MySQL為欄位新增預設時間(插入時間)MySql
- 通用SQL語句修改欄位預設值SQL
- MySQL 5.7 datetime和timestamp欄位設定default 0 插入資料包錯MySql
- mybatis-plus 透過 updateById 更新部分欄位資料時出現所有資料被更新(被設為預設值)MyBatis