標籤:double img 類型 1.2 int http upd oracle 小數
我們的系統的的選擇框的選項是儲存在一個資料庫表中的,其中大致包含了選擇框的id以及選擇選項的資料,大致如下表。其中fieldid的類型為int,optionVal為int,optionName為varchar。
| fieldid |
optionVal |
optionName |
| 1 |
0 |
北京 |
| 1 |
1 |
南京 |
| 1 |
2 |
天津 |
| 1 |
3 |
杭州 |
| 2 |
0 |
拉麵 |
| 2 |
1 |
米飯 |
今天在做需求的時候,沒有注意相應欄位的類型,直接通過java代碼就拼接了sql,大致如下。
StringBuilder sqlBuilder = new StringBuilder();sqlBuilder.append("UPDATE tablename SET") .append(optionFieldid) .append(" = ‘") .append(optionValue); .append("‘");
optionValue字串為‘‘時他儲存在資料庫裡面的值就變成了0,原以為應該把這個欄位變成‘‘,這時我才注意到這個欄位的類型為int,發生了隱式類型轉換。這裡總結一下相關資料庫的隱式類型轉換,同時在接下來的開發過程中需要多加註意資料庫的類型,避免產生意想不到的結果。
oracle
oracle遵循如下的資料類型轉換規則:
- 對於
insert和update操作,oracle將值轉換為受影響的的列的類型。
- 對於
SELECT FROM操作,oracle會將列的值的類型轉換為目標變數的類型。
- 當運算元字類型的值的時候,oracle通常會調整精度,以適應最大的容量。在者中情況下,數字類型的操作的結果可能與上表有差異。
當字串類型和數實值型別做比較時,oracle會將字串類型轉換為數實值型別。
select sysdate from dual where 1.2 = ‘1.2‘; //正確select sysdate from dual where 1.2 = ‘1.2a‘;//ORA-01722: 無效數字
- 使用字串或者
NUMBER類型和浮點數類型進行比較是不精確的。因為字串和NUMBER類型使用的是decimal精度,而浮點數使用的是binary精度。
- 當把CLOB類型的資料轉換為向
VARCHAR2這樣的類型,或者將BLOB轉換為RAW資料,如果被轉換的資料比目標類型大,那麼將會報錯。
- 在將
timestamp類型轉換為date類型的時候,小數秒部分會被階段。
- 從
BINARY_FLOAT轉換為BINARY_DOUBLE是精確的。
- 從
BINARY_DOUBLE轉換到BINARY_FLOAT類型時,如果BINARY_ DOUBLE使用了超過BINARY_FLOAT支援的精度,那麼轉換是不精確的。
當字串值和date值比較時,會將字串值轉換為date類型。對於這種情況我們不應該依賴隱式轉換,應該使用TO_DATE進行顯示轉換,隱式轉換遵循的轉換格式如下:
select * from nls_session_parameters WHERE parameter=‘NLS_DATE_FORMAT‘; //DD-MON-RR
所以在中文環境下使用如下,使用其他的格式則會報錯ORA-01861: 文字與格式字串不匹配。
select 1 + 1 from dual where to_date(‘2018-1-15 12:23:23‘,‘yyyy-mm-dd hh24:mi:ss‘) > ‘15-1月 -18‘;
- 當你使用sql或者函數,傳的參數不是參數接受的類型,那麼會把傳的這個參數轉換為函數接受的類型。
當字串和一個非字串類型進行比較或者算數運算時,會將字串轉換為列一個資料的類型。當算數運算的兩邊是CHAR/VARCHAR2 和 NCHAR/NVARCHAR2,oracle將他們轉換為NUMBER。
select ‘123‘ + ‘123.2‘ from dual; //246.2
oracle隱式類型轉換