2012-07-06 190 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