這次上線遇到乙個bug,導致回滾。定位到問題,發現是sql執行時乙個語句坑了。
簡單說下,就以update語句為例。
建立乙個表:
createtable
`test_01` (
`id`
bigint(20) not
null auto_increment comment '
auto incr id',
`a_id`
varchar(50) not
null
default
'' comment '
aid'
, `a_name`
varchar(50) not
null
default
'' comment '
aname',
primary
key(`id`)
) engine
=innodb auto_increment=
16default charset=utf8 comment=
'test表
'
插入幾條資料:
insertinto test_01(a_id,a_name) values('
a1','
n1'),('
a2','
n2'),('
a3','
n3');
ok,型別轉換時的坑來了。
update test_01 set a_name='nn'where a_id=
0;
更新的where條件是a_id=0,那麼表裡會發生更新麼?
答案就是所有的行的a_name都更新為了'nn'。
為什麼會發生這樣的問題?因為表結構中設計的a_id是varchar型別,而更新語句中where條件的a_id是數字0。
這時就發生了型別轉換的問題。mysql會把表裡a_id列下所有行都轉化為數字,去跟你告訴mysql的0進行比較。發現表裡的a_id下轉化為數字時,都轉化成為了0。那麼所有記錄取出來就對了。
所以,在sql拼寫時,一定要嚴格按照型別搞。
比如這個更新語句就應該寫成:
update test_01 set a_name='nn'where a_id='0
';// 加個引號
轉刪除資料庫使用者時占用
ora 01940 無法刪除當前已鏈結的使用者 1 檢視使用者的連線狀況 select username,sid,serial from v session 如下結果 username sid serial netbnew 513 22974 netbnew 514 18183 netbnew 51...
SQL SERVER資料庫中的資料型別 轉
每次看了每次都要忘.nchar nvarchar型,往往會忽略text和ntext型別也可以用來儲存字串,這幾種資料 型別各有所長,各有所短,在效能和功能上也存在很大的差異。因而在設計的時候就需 要選擇合適的型別儲存資料。下面簡單比較一下這幾種資料型別。1 char。char儲存定長資料很方便,ch...
建立資料庫連線執行SQL語句
載入資料庫驅動類 class.forname com.microsoft.jdbc.sqlserver.sqlserverdriver 建立連線資料庫的url指定連線的位址和資料庫名稱 string surl jdbc microsoft sqlserver 資料庫的賬戶密碼 string user...