Feeds:
文章
迴響

Archive for the ‘MySQL’ Category

INSERT 資料的陷阱

今天查一個錯誤,發現程式都沒有修改,可是資料卻沒有新增到資料庫中,後來發現問題出在類似下面這一行程式
 
insert into tblUser values(1, ‘Arick’, ‘boy’)   
這一行程式一般情況下都可以正常,可是卻隱含了一個問題,因為這個語法並沒有明確的指定新增資料
的欄位,所以必須依據資料庫中的定義和順序將全部的欄位資料都填進去,發現問題了嗎?要全部的資料欄位都填寫,假設某一個人(啊~ 就是我)在tblUser新增了一個 age 欄位,又忘了修改上面那一行程式,那就會送給你一個"Column count doesn’t match value count at row 1"的錯誤訊息,為了避免修改上所引發的錯誤,比較好的寫法是明確的清楚要填寫哪些欄位,如下:
insert into tblUser(id, name, sex) values(1, ‘Arick’, ‘boy’)   
 
這樣可以比較明確的清楚知道你要新增什麼資料,未來在維護上也比較容易,不過,該修改的地方還是要修改。

Read Full Post »

上星期技服人員丟了一個問題給我,又是一個我不熟悉的錯誤訊息,這個問題發生是出現在 INSERT 一筆資料的時候,在一堆網路資料中挖到了一篇類似的"http://bugs.mysql.com/bug.php?id=3506"的討論,我最後找出的原因是 INSERT 的資料長度超出合理範圍,超出合理範圍可能的原因是蓄意寫錯,另一個可能的原因是當初規劃沒有考量到資料數量的問題,所以,INSERT 的資料超出欄位規劃的合理範圍,因此當我擴增該資料欄位後就修復該問題。

Read Full Post »

[SQL]隨機取出10筆資料

今天學到的新技巧…
 
select *
from tblData
order by RAND(NOW())
limit 10
 
於 order by 中使用亂數排列,亂數因子設為目前的時間點
limit 設定為 10 筆資料
 
 

Read Full Post »

這個是我今天在寫案子遇到的問題,撇開效率的問題不討論,因為之前寫好的架構基於懶的緣故,所以並不想將全部的資料撈出來後再統計,因此,想要找尋相關的修飾字來解決這個問題,而且SQL也是個標準語言,使用的時間也很長了,不可能沒有人遇到這麼初淺的問題,而且我想訂定標準的人也一定提供相對應的解決方案,最後終於如我所預料的,在 mysql 的線上手冊查如下的資訊

COUNT(DISTINCT expr,[expr…])
Returns a count of the number of different non-NULL values:

ㄏㄏ… 原來只要在 COUNT 裡的欄位前面加上 DISTINCT 修飾字就可以… 真的是江湖一點訣

Read Full Post »

我對 BWTWEEN 的誤解

今天在修正案子的某個功能查詢,介面上提供一個日期區間(yyyy/mm/dd)給使用者選擇,於是我的 SQL 就下成類似下面的命令
SELECT * FROM XXX WHERE mdate BETWEEN ‘1980/1/1’ AND ‘2005/10/25’

結果我就納悶,為什麼 2005-10-25 15:50:47 這筆資料不會被抓出來,後來我發現該欄位的型態為 datetime,且將 SQL 改為

SELECT * FROM XXX WHERE mdate BETWEEN ‘1980/1/1 00:00:00′ AND ‘2005/10/25 23:59:59′

就抓到該筆資料,我想如果是 datetime 欄位而查詢時沒有指定時間字串,則預設時間似乎是 00:00:00 ,也就是說,我原來的 SQL 命令被解讀為

SELECT * FROM XXX WHERE mdate BETWEEN ‘1980/1/1 00:00:00’ AND ‘2005/10/25 00:00:00’

所以,該筆資料沒有辦法被查詢出來….ㄜ~ 天啊

Read Full Post »

varchar 加上 binary 有何用途

BINARY 修飾字的意義是表示該字串要採用"二進位"比對,也就是說大小寫視為不同字元,以下面的一個簡單範例來看,unit_code 沒有經過 BINARY 修飾處理,而 unit_name 有,接著新增一筆 aaaBBBcC 資料,測試結果發現,含有 binary 的欄位,必須大小寫吻合才可以到該資料,沒有該修飾字的則不需要。

CREATE TABLE test(
  unit_code varchar(20) DEFAULT ‘aBc’,
  unit_name varchar(32) BINARY DEFAULT ‘EfG’
);

insert into test (unit_code) values(‘aaaBBBcC’);

SELECT * FROM test WHERE unit_code = ‘aaaBBBcC’; // yes
SELECT * FROM test WHERE unit_code = ‘aaabbbcc’; // yes

select * FROM test where unit_name = ‘efg’; // no
select * FROM test where unit_name = ‘EfG’; // yes

 

 

Read Full Post »

SQL_SMALL_RESULT 有何用途

之前剛接觸 MySQL 的時候,同事告訴我如果查詢的資料結果很小,可以加上 SQL_SMALL_RESULT 來最佳化,可是最近查找 MySQL 官方手冊的時候發現,SQL_SMALL_RESULT 必須與 GROUP BY、DISTINCT 或 DISTINCTROW 一起使用。那是不是說沒有使用上述那個修飾字的查詢,加上 SQL_SMALL_RESULT 並沒有效果呢?似乎並不是這樣,在 MySQL 講述 where 最佳化的的地方也有提到,假如使用 SQL_SMALL_RESULT,將會要求 MySQL使用記憶體臨時資料表( in-memory temporary table),所以,應該還是有效果的。至於何謂查詢結果小的定義,可能要看需求面而定。

Read Full Post »

Older Posts »