資料庫執行語句時,嚴重注意型別轉換的問題

2022-08-14 05:57:15 字數 1221 閱讀 4811

這次上線遇到乙個bug,導致回滾。定位到問題,發現是sql執行時乙個語句坑了。

簡單說下,就以update語句為例。

建立乙個表:

create

table

`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表

'

插入幾條資料:

insert

into 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...