2012-07-06 105 views
1

我列了以下信息:一列分成兩列(SQL)

Author varchar(255) utf8_general_ci 

誰設計的網站我使用該列來存儲兩件事情之前,程序員! 首先,作者的英文名稱,然後他/她的名字用阿拉伯語!因此,該列中的所有數據具有相同的結構:تووياما أيما (Tooyama Ema) 括號之間是英文名稱。括號外是阿拉伯語的名字。 有什麼方法可以把英文名稱放在新的專欄中。加刪除括號?我可以同時使用PHP和SQL,所以請你給我一個這兩種語言的解決方案? 我想要的結果看起來像這樣:

作者:تووياما أيما 作者英文:Tooyama Ema

我說的是具有相同結構的多行。我想改變數據庫中的結構。

+0

聽起來很容易。 [你有什麼嘗試?](http://whathaveyoutried.com) – sczizzo 2012-07-06 20:33:10

+0

我沒有嘗試任何東西。我不知道如何分離它。 「Author」列有20000行。我想自動完成所有這些,而不會出錯。 – shnisaka 2012-07-06 20:35:09

回答

3

我推薦一個數據庫驅動的解決方案,應該比使用PHP少花時間編碼和運行。

在表名不知道,但這裏是你需要什麼,改變自己的喜好肉類:

(假設粗糙表的定義)

CREATE TABLE Test (
    id int(11) not null auto_increment, 
    Author varchar(255), 
    primary key (id) 
) 

新的ALTER TABLE列:

ALTER TABLE Test ADD COLUMN `arabic_name` varchar(255) AFTER `Author`; 
ALTER TABLE Test ADD COLUMN `english_name` varchar(255) AFTER `arabic_name`; 

一個簡單的更新語句將數據遷移(不是最漂亮的,但工作得很好):

UPDATE Test 
SET 
arabic_name = SUBSTR(TRIM(Author), 1, LOCATE(' ', TRIM(Author)) - 1), 
english_name = SUBSTR(TRIM(Author), LOCATE('(', TRIM(Author)) + 1, LOCATE(')', TRIM(Author)) - LOCATE('(', TRIM(Author)) - 1); 
+2

這更合理。無需爲此做一次性應用程序。 – dodexahedron 2012-07-06 22:04:34

+1

我同意。這比其他答案要好得多。 =)+1 – shnisaka 2012-07-08 08:52:02

3
$str = "تووياما أيما (Tooyama Ema)"; 
preg_match("/(.+) \((.+)\)/", $str, $matches); 

var_dump($matches); 
+0

但這只是我想要在所有行中執行的一行。我想更改SQL中的結構。不在PHP中。 – shnisaka 2012-07-06 20:37:22

+0

@shnisaka:您需要選擇所有記錄,進行處理,然後進行更新。我建議你使用準備好的陳述與交易一起使用。有關更多詳細信息,請參閱[PDO手冊](http://il.php.net/manual/en/book.pdo.php)。 – 2012-07-06 20:39:33

+0

哦!我沒有想到這一點! 謝謝! – shnisaka 2012-07-06 20:41:08