PDA

View Full Version : سوال: مشکل با فایل SQL خارجی



LORD AELX
چهارشنبه 13 مرداد 1389, 13:08 عصر
من میخوام تو فایل PHP ام دستورات درون یک فایل SQL خارجی را اجرا کنم. این فایل حاوی دستوراتی برای ساخت چند جدول در دیتابیس می باشد. ولی دستورات مشکل دارند. فکر کنم قبل از آوردن نام Table باید نام Database را بیاورم ولی این کار ممکن نیست مگر اینکه یک کلاس SQL Parser بنویسم و بخش های مورد نظرم رو ادیت کنم. شما لطفا ببینید دستور زیر از لحاظ synatx خود SQL چه مشکلی دارد:


CREATE TABLE IF NOT EXISTS `system` {
`id` int NOT NULL auto_increment,
`abc` VARCHAR (20) NOT NULL,
`def` VARCHAR (20) NOT NULL,
PRIMARY KEY ( `id` )
} DEFAULT CHARSET=utf8;


یا این:


CREATE TABLE IF NOT EXISTS `system` {
`id` int NOT NULL auto_increment,
`abc` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`def` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM"


متشکرم :قلب:

eshpilen
چهارشنبه 13 مرداد 1389, 19:09 عصر
چی میگی این چه طرز سوال کردنه :لبخند:

پیام خطاش چی شد؟

بعدشم خب دیتابیس رو قبلا بعنوان دیتابیس پیشفرض معرفی کن دیگه.

LORD AELX
چهارشنبه 13 مرداد 1389, 19:59 عصر
چی میگی این چه طرز سوال کردنه :لبخند:

پیام خطاش چی شد؟

بعدشم خب دیتابیس رو قبلا بعنوان دیتابیس پیشفرض معرفی کن دیگه.

خوب وقتی خودم نمیدونم چه مرگشه، چطور انتظار داری واضح بپرسم؟! :لبخند: :گیج:

ببین جالب این جاست که من وقتی با خود phpmyadmin یه table می سازم و بعد کدی که تولید کرده و نشون داده رو خودم در قسمت SQL اجرا می کنم کار می کنه (باید هم بکنه!! :لبخند:) ولی اگر بصورت دستی خودم عین همون کد رو از فایلم کپی می کنم و توش میذارم، کار نمی کنه!! :گیج: فکر کنم مشکلش از کاراکتر های مخفی باشه... error اش هم 1064# هستش یعنی syntax مشکل داره. حالا من اینو یه کاریش می کنم...

ببین، تو یه چیزی رو به من بگو... :متفکر: اول این که اگر بخوام توی table کاراکترهای زبان های مختلف رو ذخیره کنم، مثلا فارسی، چینی و ... و در واقع یونیکد UTF-8 رو بخوام اعمال کنم، کدوم یک از دو روش بالا باید استفاده بشه؟ چه فرقی دارند اینا با هم؟ از طرف دیگه چرا تو روش دوم هم CHARACTER SET رو مقدار دهی کرده و هم COLLATE رو؟ اصلا اینا دقیقا چی هستند؟

راستی، در مورد مقدار COLLATE می خواستم بدونم فرق utf8_general_ci با utf8_unicode_ci و utf8_bin چیه؟

متشکرم :قلب:

LORD AELX
چهارشنبه 13 مرداد 1389, 20:03 عصر
راستی، در مورد اجرا کردن دستورات درون فایل SQL با PHP چطور عمل کنم؟ بیام فایل رو بخونم و محتویاتش رو بریزم تو یک متغیر و بعد با mysql_query اجراش کنم یا اینکه آدرس رو به mysql_query بدم (یکی می گفت میشه و من هم هنوز امتحان نکردم) و یا اینکه توسط دستور exec و با دستورات Command Line اون dump کنم؟

متشکرم :قلب:

eshpilen
چهارشنبه 13 مرداد 1389, 20:52 عصر
اول این که اگر بخوام توی table کاراکترهای زبان های مختلف رو ذخیره کنم، مثلا فارسی، چینی و ... و در واقع یونیکد UTF-8 رو بخوام اعمال کنم، کدوم یک از دو روش بالا باید استفاده بشه؟ چه فرقی دارند اینا با هم؟ از طرف دیگه چرا تو روش دوم هم CHARACTER SET رو مقدار دهی کرده و هم COLLATE رو؟ اصلا اینا دقیقا چی هستند؟فرقی که در دو کد بالا دیده میشه در مشخص کردن utf8 هست که مسلمه باید از روش دوم استفاده کنیم. جزییات فنیش رو دقیقا حضور ذهن ندارم اما من قبلا این دو روش رو امتحان کردم و با مشکلات عدم مشخص کردن utf8 برخورد کردم. حداقلش یکسری مشکلات نمایشی ایجاد میکنه، البته نه لزوما در برنامهء ما! میشه طوری نوشت که بدون مشخص کردن utf8 هم برنامهء ما بدون مشکل کاربردی کار بکنه، اما اصولی نیست و بعضی جاها مشکلات نمایشی ایجاد میکنه. بازم میگم دقیق یادم نیست کجا؛ فکر میکنم توی phpmyadmin وقتی محتویات اون فیلدهایی رو که با utf8 مشخص نکردی میبینی، بصورت عجق وجق نشون داده میشن!
بالاخره مشخص کردن utf8 حداقل یک نوع متادیتا هست؛ و البته این متادیتای خاص خیلی کلی و اساسی هست و برای برنامه نویسی اصولی لازمه. جزییات فنی تفاوتشون در عمل پیش میاد که من چون خیلی وقت پیش کار کردم یادم نیست؛ خودت مواجه میشی یا تست میکنی متوجه میشی.
راستی! الان یادم اومد که احتمالا از نظر حجمی هم بدون مشخص کردن utf8 مشکل جدی خواهیم داشت! (که میتونه پنهان بمونه و/یا منجر به باگ بشه) چون طول کاراکترها در utf8 بر اساس کاراکتر یونیکدی مشخص میشه، اما در فیلدهایی که utf8 تعریف نکردی، بر اساس بایت.

COLLATE رو هم دقیقا یادم نیست ولی میدونم به مرتب کردن (Sort مربوط میشه). فکر میکنم COLLATE رو صریحا مشخص کرده که اگر دیتابیس یا جدول COLLATE پیشفرض دیگری داشت مشکلی پیش نیاد.


راستی، در مورد اجرا کردن دستورات درون فایل SQL با PHP چطور عمل کنم؟ بیام فایل رو بخونم و محتویاتش رو بریزم تو یک متغیر و بعد با mysql_query اجراش کنم یا اینکه آدرس رو به mysql_query بدم (یکی می گفت میشه و من هم هنوز امتحان نکردم) و یا اینکه توسط دستور exec و با دستورات Command Line اون dump کنم؟متاسفانه دقیق نمیدونم. چیزی یادم نمیاد! اصلا نیاز و کار عملی نداشتم آخه!
بحث روی اینا نیاز به تحقیق و تحلیل داره که فعلا منابعش (وقت و انرژی) رو ندارم.
خودت ماشالا کاردانی با یخورده پشتکار خب کشف میکنی دیگه! تازه بروبچ خارجکی هم هستن که ازشون سوال بپرسی؛ تو هم که ماشالا روابط خارجکیت مشکلی نداره :لبخند:
هرچی کارای خسته کننده و الکی هست میای میندازی گردن ما :عصبانی:


فرق utf8_general_ci با utf8_unicode_ci و utf8_bin چیه؟بازم دقیق جزییات فنیش رو یادم نیست. من معمولا از utf8_general_ci استفاده میکنم.
بنظرم اینا رو باید در رفرنس MySQL جستجو کنی (بنده قبلا رفرنس نسخهء 4 و خورده ای رو کامل خوندم - البته خیلی طول کشید!).
بطور کلی روشهای مرتب سازی هستن. general احتمالا یه چیزی کلی هست که جزییات زبانها و کشورهای خاص رو درنظر نمیگیره و بر اساس code point عمل میکنه؛ unicode احتمالا یکسری تعریف ها و قواعد اضافه تر داره؛ bin هم که لابد بصورت باینری و کاملا خام مقایسه میکنه (احتمالا بصورت بایت به بایت، بجای کاراکتر به کاراکتر). خلاصه از اینطور چیزا!! مثلا ما مرتب سازی persian هم داریم که میتونید برای زبان فارسی ازش استفاده کنید تا دقیقتر و منطبق با استانداردهای زبان فارسی باشه. (اما شخصا فکر نمیکنم در بیشتر کاربردها نیازی به اینطور چیزا باشه).

bestirani2
چهارشنبه 13 مرداد 1389, 21:02 عصر
مشکلت از نگارش دستورات sql ات هست

تو نوشتی


CREATE TABLE IF NOT EXISTS `system` {

`id` int NOT NULL auto_increment,

`abc` VARCHAR (20) NOT NULL,

`def` VARCHAR (20) NOT NULL,

PRIMARY KEY ( `id` )

} DEFAULT CHARSET=utf8در صورتی که به جای آکولاد باید پرانتز قرار میدادی یعنی


CREATE TABLE IF NOT EXISTS `system` (

`id` int NOT NULL auto_increment,

`abc` VARCHAR (20) NOT NULL,

`def` VARCHAR (20) NOT NULL,

PRIMARY KEY ( `id` )

) DEFAULT CHARSET=utf8مشکل دیگه ای نداره

bestirani2
چهارشنبه 13 مرداد 1389, 21:07 عصر
اول این که اگر بخوام توی table کاراکترهای زبان های مختلف رو ذخیره کنم، مثلا فارسی، چینی و ... و در واقع یونیکد UTF-8 رو بخوام اعمال کنم، کدوم یک از دو روش بالا باید استفاده بشه؟ چه فرقی دارند اینا با هم؟ از طرف دیگه چرا تو روش دوم هم CHARACTER SET رو مقدار دهی کرده و هم COLLATE رو؟ اصلا اینا دقیقا چی هستند؟


CHARACTER SET مربوط میشه به نوع یونیکدی که ذخیره میکنی
COLLATE هم برای مرتب سازی با توجه به یک قانون هست که ما persian رو انتخاب میکنیم

bestirani2
چهارشنبه 13 مرداد 1389, 21:10 عصر
راستی، در مورد اجرا کردن دستورات درون فایل SQL با PHP چطور عمل کنم؟ بیام فایل رو بخونم و محتویاتش رو بریزم تو یک متغیر و بعد با mysql_query اجراش کنم یا اینکه آدرس رو به mysql_query بدم (یکی می گفت میشه و من هم هنوز امتحان نکردم) و یا اینکه توسط دستور exec و با دستورات Command Line اون dump کنم؟

متشکرم :قلب:

بریز تو متغیر و بعد به mysqli_query بده
منظورت از دادن آدرس چیه
یکی از قابلیت های اس کیو ال این هست که جدول ها رو از یک فایل متنی بخونه که این هم یک دستور اس کیو ال هست که باید در mysqli_query اجرا بشه
منظورت این هست؟

bestirani2
چهارشنبه 13 مرداد 1389, 21:16 عصر
فرق utf8_general_ci با utf8_unicode_ci و utf8_bin چیه؟

utf8_general_ci به کوچک و بزرگی حروف غیر حساس هست که در زبان فارسی مطرح نیست که utf8_unicode_ci برای استفاده در زبان های دیگری به غیر انگلیسی مثل فارسی هست و آخری هم باینری هست

LORD AELX
چهارشنبه 13 مرداد 1389, 21:39 عصر
بریز تو متغیر و بعد به mysqli_query بده
منظورت از دادن آدرس چیه
یکی از قابلیت های اس کیو ال این هست که جدول ها رو از یک فایل متنی بخونه که این هم یک دستور اس کیو ال هست که باید در mysqli_query اجرا بشه
منظورت این هست؟

مثلا به این شکل:


musql_query('setup.sql');


شما در مورد چه دستوری صحبت می کنید؟ ببینید من فقط میخوام یک فایل حاوی دستورات SQL رو اجرا کنم، آیا غیر از روش هایی که خودم گفتم، روش دیگری هم هست؟


utf8_general_ci به کوچک و بزرگی حروف غیر حساس هست که در زبان فارسی مطرح نیست که utf8_unicode_ci برای استفاده در زبان های دیگری به غیر انگلیسی مثل فارسی هست و آخری هم باینری هست

یعنی utf8_general_ci بصورت uncasesensitive هستش و utf8_unicode_ci بصورت casesensitive ؟؟ ضمنا آیا utf8_unicode_ci انگلیسی قبول نمی کند؟ مگر می شود؟؟ :متفکر: من میخوام قابلیت ذخیره سازی تمام زبان های چه اروپایی و چه آسیای شرقی و خاور میانه ای رو داشته باشم (یعنی یک بایتی، دو بایتی و سه بایتی)، آیا فرقی بین استفاده از این سه نوع برای من هست؟ general مناسب تره یا unicode ؟ چرا؟

متشکرم :قلب:

LORD AELX
چهارشنبه 13 مرداد 1389, 21:47 عصر
مشکلت از نگارش دستورات sql ات هست

تو نوشتی


CREATE TABLE IF NOT EXISTS `system` {

`id` int NOT NULL auto_increment,

`abc` VARCHAR (20) NOT NULL,

`def` VARCHAR (20) NOT NULL,

PRIMARY KEY ( `id` )

} DEFAULT CHARSET=utf8در صورتی که به جای آکولاد باید پرانتز قرار میدادی یعنی


CREATE TABLE IF NOT EXISTS `system` (

`id` int NOT NULL auto_increment,

`abc` VARCHAR (20) NOT NULL,

`def` VARCHAR (20) NOT NULL,

PRIMARY KEY ( `id` )

) DEFAULT CHARSET=utf8مشکل دیگه ای نداره

بلی، حرف شما درسته، اشتباه تایپی بود... :خجالت: نمیدونم چرا همه دستورات رو بین آکولاد گذاشتم!! :لبخند: هر چی هم دقت کردم اینو نفهمیدم!! :گیج: ببین این فسقلی چند ساعت منو سر کار گذاشت!! :قهقهه:

متشکرم :قلب:

bestirani2
چهارشنبه 13 مرداد 1389, 21:56 عصر
شما در مورد چه دستوری صحبت می کنید؟ ببینید من فقط میخوام یک فایل حاوی دستورات SQL رو اجرا کنم، آیا غیر از روش هایی که خودم گفتم، روش دیگری هم هست؟


چنین کاری رو که گفتید امکان پذیر نیست به غیر این که فایل مربوطه را با توابع مربوط به فایل باز کنیم و در یک رشته برزیم و مثل قبل رشته را بدهیم

در ضمن در mysql امکان استفاده از مولتی کوئری نیست که اگر نیاز به این کار دارید mysqli را استفاده کنید

در نهایت دستور اس کیو ال باید داخل توابع مربوط به کوئری اضافه شود ولی خود مای اس کیو ال هم امکاناتی برای این کار دارد مثل خواندن از داخل یک فایل متنی

bestirani2
چهارشنبه 13 مرداد 1389, 21:58 عصر
یعنی utf8_general_ci بصورت uncasesensitive هستش و utf8_unicode_ci بصورت casesensitive ؟؟ ضمنا آیا utf8_unicode_ci انگلیسی قبول نمی کند؟ مگر می شود؟؟ :متفکر: من میخوام قابلیت ذخیره سازی تمام زبان های چه اروپایی و چه آسیای شرقی و خاور میانه ای رو داشته باشم (یعنی یک بایتی، دو بایتی و سه بایتی)، آیا فرقی بین استفاده از این سه نوع برای من هست؟ general مناسب تره یا unicode ؟ چرا؟

utf8_unicode_ci هم انگلیسی قبول میکنه
بهترین حالت برای دو زبانه همین utf8_unicode_ci هست چون utf8_general_ci میشه گفت برای زبان های اروپایی هست نه شرقی

bestirani2
چهارشنبه 13 مرداد 1389, 21:59 عصر
بلی، حرف شما درسته، اشتباه تایپی بود... :خجالت: نمیدونم چرا همه دستورات رو بین آکولاد گذاشتم!! :لبخند: هر چی هم دقت کردم اینو نفهمیدم!! :گیج: ببین این فسقلی چند ساعت منو سر کار گذاشت!! :قهقهه:

متشکرم :قلب:

توی پی اچ پی مای ادمین میتونی روی creat php code کلیک کنی تا اون رو توی یک متغیر بگذاره برای استفاده در پی اچ پی تا دیگه بدین مشکل ها بر نخوری

LORD AELX
چهارشنبه 13 مرداد 1389, 22:09 عصر
در ضمن در mysql امکان استفاده از مولتی کوئری نیست که اگر نیاز به این کار دارید mysqli را استفاده کنید


چرا نیست؟! :اشتباه: یعنی MySQLi بهتر از خود MySQL هستش؟ دلایل؟

از طرف دیگه من توی خیلی از اسکریپت ها دیدم که از روش External SQL File استفاده می کنند و بعید می دونم راهی نباشه! یعنی همه آن ها از MySQLi استفاده می کنند؟

اینو باید جداگانه نصب کرد؟ روی همه سرور ها support میشه؟

ممنون :بوس:

eshpilen
چهارشنبه 13 مرداد 1389, 22:15 عصر
آره راست میگه utf8_unicode_ci جدیدتر و بهتره (الان رفرنس رو نگاه کردم نوشته اونیکی قدیمی هست و فقط سرعتش بیشتره).

bestirani2
چهارشنبه 13 مرداد 1389, 22:19 عصر
چرا نیست؟! :اشتباه: یعنی MySQLi بهتر از خود MySQL هستش؟ دلایل؟

از طرف دیگه من توی خیلی از اسکریپت ها دیدم که از روش External SQL File استفاده می کنند و بعید می دونم راهی نباشه! یعنی همه آن ها از MySQLi استفاده می کنند؟

اینو باید جداگانه نصب کرد؟ روی همه سرور ها support میشه؟

ممنون :بوس:
mysqli فقط یک extension برای اتصال به mysql است که میشه گفت نسخه جدید extension mysql هست
اس کیو ال خارجی هم ربطی به این دو نداره
همانطور که گفتم با توابع فایل محتویات یک فایل را میخوانی و وارد یک رشته میکنی و به توابع اس کیو ال میفرستی

ولی mysqli از مولتی کوئری هم ساپورت میکنه و میتونی چندین کوئری رو همزمان بفرستی البته توی mysql هم میتونی بیای هر جا سمی کالن بود را جدا کنی و یک کوئری در نظر بگیری و آخر سر همه رو اجرا کنید
در کل mysqli امکانات بیشتری داره و به صورت شئ گرا هست همچنین سرعتش تا حدی بالاتر هست البته در بنچ مارکهایی که من دیدم
روی تمام نسخه های پی اچ پی خودش هست
اگه اشتباه نکنم از نسخه 5 به بعد
این هم extension داخلی پی اچ پی هست و به صورت داخلی هست و نیازی به فعال سازی هم نیست

bestirani2
چهارشنبه 13 مرداد 1389, 22:20 عصر
آره راست میگه utf8_unicode_ci جدیدتر و بهتره (الان رفرنس رو نگاه کردم نوشته اونیکی قدیمی هست و فقط سرعتش بیشتره).

دلیل سرعتش هم به خاطر حساس نبودن به حروف هست

SAMAN_PHP
پنج شنبه 14 مرداد 1389, 00:53 صبح
سلام
LORD AELX جان من پست هارو سرع خوندم ,اگه منظورت ساخت جدول mysqlاز طریق phpباشه
این کد sqlکه نوشتی رو توی mysql_query بزار مثل کد زیر
البته قبلش باید اتصال به بانک رو انجام داده باشی

mysql_query("CREATE TABLE `admin` (
`id` int(30) NOT NULL auto_increment,
`username` varchar(30) NOT NULL,
`password` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2");

به همین طریق میتونی چندین جدول رو بسازی
موفق باشی

eshpilen
پنج شنبه 14 مرداد 1389, 08:12 صبح
دلیل سرعتش هم به خاطر حساس نبودن به حروف هست
حساس نبودن به حروف دقیقا یعنی چی؟

bestirani2
پنج شنبه 14 مرداد 1389, 09:57 صبح
حساس نبودن به حروف دقیقا یعنی چی؟

یعنی در زبانی مثل انگلیسی فرقی نداره حروف کوچک و بزرگ

eshpilen
پنج شنبه 14 مرداد 1389, 11:36 صبح
خب اینا که تهش ci داره همش همینطوره (مخفف case insensitive).

bestirani2
پنج شنبه 14 مرداد 1389, 11:50 صبح
خب اینا که تهش ci داره همش همینطوره (مخفف case insensitive).

درسته ولی general به صورت کلی هست و فرقی بین زبان ها قائل نمیشه و برای زبانی مثل فارسی هم به دنبال بررسی این موضوع هست ولی unicode به صورت منحصر به فرد هست و سرعتش در زبانهایی مثل فارسی بیشتر هست، البته در زبان انگلیسی فرقی ندارد.