Mysql 的語系可對table 進行指定,而且每個欄位(varchar or text)也都可以特別指定語系為何
這麼彈性的設計,當然在使用時也要特別小心
當在使用mysql 的管理工具進行整個Table 轉換語系時,似乎所屬的各欄位語系還是照舊
不知是何原因,不過在資料庫table一多時,這樣轉換起來是很費時又費工的
所以在此介紹可以利用sql 指令進行轉換,來達到轉換語系的工作
ALTER TABLE test CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
這行可以針對test 進行轉換語系,經使用後發現,他會連該table 各欄位都可以一併轉換
所以我們可以搭配show tables,來看看目前該資料庫有多少table 再用這指令去轉換,就可以很方便進行語系轉換啦
以下為相關會有用到的語法,大家參考看看…
show variables like '%character%';
這行是在顯示目前mysql的變數為何? 可以查看目前資料庫語系或client 語系
ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE. utf8_unicode_ci;
這行指令可以是設定資料庫的預設語系為何?
show databases;
顯示目前mysql 下的資料庫名稱
show tables;
顯示目前table 名稱
show columns from table;
顯示table 裡的各欄位名稱;
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern' | WHERE expr]
可以查看資料庫是用何者型態(myisam,innodb..)建立的
先前開發的小系統,都不太喜歡用constraint,怕在匯入或一些從db 下手作業時會很麻煩,不過系統愈做愈大
還是一定要用constraint 這樣才不會因為程式漏做了而造成資料失去完整性或關連
根據 ANSI SQL92 的標準來看,在違 反 integrity constraint 時,資料庫系統可以採取 4 種動作 :
- set NULL,即當 parent table 中 delete 或 update 一筆資料時,foreign table 上的資料是設為 NULL。
- set default,設 foreign key 為 最初的default value。
- cascade,即當 delete 或 update parent table 時,對 foreign table也做 同樣的 delete 或 update。有了cascade 的功能之後,在我們開發 application 就可以節省處理 integrity constraint 的時間了。
- no action (restrict),即當此筆資料存在有 foreign key 時,不允許做 delete 或 update。也就是說必須將此 integrity constraint 除去後才能做 delete 或 update。
Mysql
在INNODB型態下才有支援外來鍵,不然會是設假的,INNODB型態才會檢查是否有違反外來鍵限制,會依ON UPDATE CASCADE(參考主鍵修改,外來鍵會跟著改),ON DELETE SET NULL(參考主鍵刪除,外來鍵會變空值)…等等的CASCADE 限制對table處理
以下的語法是檢查是否符合外來鍵限制條件。0是關掉檢查,1是打開檢查。
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;
以下的例子則是在建立表格時指定外來鍵:
MySQL:
CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Amount double,
Primary Key (Order_ID),
Foreign Key (Customer_SID) references CUSTOMER(SID));
Oracle:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date date,
Customer_SID integer references CUSTOMER(SID),
Amount double);
SQL Server:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date datetime,
Customer_SID integer references CUSTOMER(SID),
Amount double);
以下的例子則是藉著改變表格架構來指定外來鍵:
MySQL:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
Oracle:
ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
SQL Server:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);
最近有用到計算排名的sql 語法
找了一下才知 mysql 本身是沒有提供類似的函式
只能用sql 語法 組出來以下語法就行啦
more..
select 姓名,總分, (select count(*)+1 from 成績 s where a.總分< s.總分) as 名次 from 成績 a
在MSSQL 可用 temp table 來做
create table #tmp
(
學號 int,
姓名 varchar(50),
成績 int,
名次 int
IDENTITY(1,1)
)
insert into #tmp (學號, 姓名, 成績) select 學號, 姓名, 成績 from
table1 order by 成績 desc
select * from #tmp order by 學號
而在SQL Server 2005及Oracle 就有支援排行的函式可以用啦 該函式叫做RANK() 先記下來,改天有空再深入瞭解
Oracle在Order by 時會預設認為null是最大值,所以如果是ASC升序則排在最後,DESC降序則排在最前
有幾種方式可以處理排序欄位有 null 值,大致如下:
1.使用nulls first 或者nulls last 語法
Nulls first和nulls last是Oracle Order by支援的語法 (mysql 不支援 ,但此為 SQL 99 standard 語法)
如果Order by 中指定了運算式 Nulls first則表示null值的記錄將排在最前(不管是asc 還是 desc)
反之 Nulls last則表示null值的記錄將排在最後 (不管是asc 還是 desc)
使用語法如下:
–將nulls始終放在最後
select * from products order by order_date desc nulls last
2、使用nvl函數
nvl函數可以將輸入參數為空時轉換為一特定值,如
nvl(employee_name,’張三’)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過這個函數可以定制null的排序位置。
3、使用decode函數
decode函數比nvl函數更強大,同樣它也可以將輸入參數為空時轉換為一特定值,如
decode(employee_name,null,’張三’, employee_name)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過這個函數可以定制null的排序位置。
4、使用case 語法
Case語法是Oracle 9i後開始支援的,是一個比較靈活的語法,同樣在排序中也可以應用
如:
select *
from employee
order by (case employee_name
when null then
'張三'
else
employee_name
end)
表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name
通過case語法同樣可以定制null的排序位置。
文章出處 :http://211.147.225.34/gate/big5/oracle.chinaitlab.com/induction/727571.html
昨天客戶的MS SQL 掛掉了
美好的颱風天~還是要處理公事
連上去看代碼 Error 823 查詢的結果應該是一般是磁碟問題
http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=349467&SiteID=14
不過有請硬體廠商前往查看 似乎一切正常
在可能沒有備份的情況下,可能我們要想辦法修復
上網找了一下解決方案…..
more..
目前找到了解決方案,不過當然前提下是沒有備份的狀況
執行了以下指令
sp_configure 'allow updates' , 1 reconfigure with override
Go
update sysdatabases set status = 32768 where name = 'CCC'
Go
sp_dboption 'CCC', 'single user', 'true'
Go
DBCC CHECKDB('CCC')
Go
update sysdatabases set status =28 where name='CCC'
Go
sp_configure 'allow updates', 0 reconfigure with override
Go
sp_dboption 'CCC', 'single user', 'false'
Go
sp_resetstatus 'CCC'
Go
發現db 還是無法用 它會提到目前還是single user 真是怪
所以我又重開了DB後 再重下一次 但這次少了single user 那行指令
修復後,終於可以使用了,用管理工具看似乎資料還在
這是好消息
不過AP系統重開後,還是有很多連上去怪怪的訊息
Msg 3908, Level 16, State 1, Line 1, Sqlstate 25000
[DB]無法執行 BEGIN TRANSACTION 於資料庫 'CCC' 因為資料庫目前為繞道復原模式。
再去查看一下,才知修復後還是有點問題,應要重新建立一個新的DB並用DTS轉匯過去
看來備份是很重要的,希望客戶那可以找到他們的備份資料檔
相關資訊來源:
http://www.adminfan.com/Article/40/20070910/3819.html
http://bbs.toseek.info/cgi-bin/topic.cgi?forum=8&topic=43&show=0
近期留言