মাইএসকিউএল ক্ষেত্রে সংবেদনশীল নির্বাচন করুন


242

কোনও মাইএসকিউএল SELECTকোয়েরি যদি সংবেদনশীল বা ডিফল্টরূপে সংবেদনশীল না হয় তবে কি কেউ আমাকে বলতে পারবেন ? এবং যদি তা না হয় তবে আমাকে কী জিজ্ঞাসা প্রেরণ করতে হবে যাতে আমি এর মতো কিছু করতে পারি:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

কোথায় বাস্তবতা, প্রকৃত মান Valueহল IAreSavage


44
শেষ পর্যন্ত এটি দায়েরকৃত জোটের উপর নির্ভর করে - যদি এটি '_ci' (কেস-সংবেদনশীল) বা '_সিএস' (কেস-সংবেদনশীল) হয়
জোভান পেরোভিচ

15
এটি একটি খারাপ শব্দযুক্ত প্রশ্ন;)। অর্ধ উত্তর আপনাকে কীভাবে সংবেদনশীল তুলনা করবেন তা দেখিয়ে দিচ্ছে, অর্ধেকটি কেস সংবেদনশীলকে লক্ষ্য করে। এবং কেবল 1 আপনাকে বলে যে ডিফল্টটি আসলে সংবেদনশীল। :) এটি লক্ষণীয় যে কেস সংবেদনশীলতা কাজ করে এমনকি যখন আপনি এর তুলনা করেন'value' in ('val1', 'val2', 'val3')
সালটিএনটস

5
@ স্যালটিনাটস মানুষ, 7 বছর পরে এই প্রশ্নটি পড়ে এবং বুঝতে পেরেছিলাম যে আমি কতটা নুয়ে ছিলাম বিব্রতকর! আমি কেবল ডকুমেন্টেশনটি পড়তে পারতাম এবং উত্তরটি নির্বাচিত বিবৃতি সম্পর্কে প্রথম বাক্যের মতোই ...
নুডলঅফডিথ

@ জোভানপেরোভিচ যা বলেছেন তাতে যুক্ত করতে, utf8_bin এটিকে কেসটি সংবেদনশীল করে তোলে। নিশ্চিত না যে এটি যদি আবার উপস্থিত থাকে
চিওদা

উত্তর:


494

এইগুলি হল কেস অসংবেদী , যদি না আপনি একটি বাইনারি তুলনা


3
আমি বেশিরভাগই টিমের মন্তব্যের সাথে একমত নই, আমি মনে করি না যে আপনার মানগুলিতে সর্বত্র "নিম্ন ()" করা এটিকে হ্যান্ডেল করার সর্বোত্তম উপায়, মনে হয় এটি একটি কর্মবিরোধী বলে মনে হয়। তবে আমি এটি স্বীকার করি যে এটি সময়ে বোঝা যায় এবং সহজ। (কলিন উল্লেখ করেছিলেন কোলেটটি ভাল ছিল) আমাদের historicalতিহাসিক ডেটা মাইএসকিএল টেবিলে স্থানান্তরিত হয়েছিল যা নির্দিষ্ট স্তম্ভের সংবেদনশীল ক্ষেত্রে মানগুলির কারণে লিগ্যাসি লজিককে ভেঙে দেয়। আমাদের "GE1234" এবং "ge1234" এর মধ্যে পার্থক্যটি জানতে হবে, তাদের অনন্য হতে হবে এবং সেইভাবে লগ থাকা দরকার। পরিবর্তে এইভাবে আমরা টেবিলের বিবৃতি তৈরিতে আমাদের কলামটি সেট করে রেখেছি: বর্ণচর (20) চরিত্র সেট utf8 কল করুন utf8_bin
গ্রেগ থেগেক

19
এত লোক কেন এটিকে ভোট দিয়েছে তা আমি জানি না। এটি এখানে পরিষ্কারভাবে জানিয়েছে যে dev.mysql.com/doc/refman/5.0/en/case- حساس তা html যে "... এর অর্থ বর্ণানুক্রমিক অক্ষরের জন্য, তুলনাগুলি সংবেদনশীল হবে।" সুতরাং আমি যদি 'ডিকস্যাভেজউডউড' সন্ধান করি তবে এটি 'ডিক্স্যাভেজউইড' তুলবে না। LOWER () দিয়ে একই কাজ করা এটি বেছে নেবে। সুতরাং প্রশ্নের আমার উত্তর: আপনার নির্দিষ্ট ক্ষেত্রে নির্বাচন প্রকৃতপক্ষে ক্ষেত্রে সংবেদনশীল।
Luftwaffle

10
@ ব্যবহারকারী ১৯616175৫৩: আবার পড়ুন: "বাইনারি স্ট্রিংগুলির জন্য (ভেরিনারি, ব্লব) ... কেস সংবেদনশীল হবে"।
মার্ক বি

1
@ মার্কবি এই লিঙ্কটি এখন ভেঙে গেছে। আপনি এটা ঠিক করতে পারেন? :)
পিটার

5
জোভান যেমন বলেছিলেন, এটি জোটের উপর নির্ভর করে, সুতরাং এই উত্তরটি বেশ ভুল।
ফিল্ড 294

117

আপনি মান এবং পাস প্যারামিটার ছোট করতে পারেন:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

আর একটি (আরও ভাল) উপায় COLLATEহ'ল ডকুমেন্টেশনে যেমন বলা হয়েছে অপারেটরটি ব্যবহার করা


21
এই SELECTবিবৃতিটি COLLATEতখন কীভাবে ব্যবহার করবে ?
হ্যাঁ ব্যারি

11
এটি উপরে উল্লিখিত ডকুমেন্টেশন পৃষ্ঠায় বলা হয়েছে যে "ননবাইনারি স্ট্রিং তুলনাগুলি ডিফল্টরূপে সংবেদনশীল হয় না"।
পের কুইস্টেড আরনসন

9
এই উত্তরটি কত লোককে আপত্তিজনক করে তুলেছিল of @Marc উপরে ব্যাখ্যা হিসাবে, তুলনা হয় কেস-অবশ। আপনার কোলিশেশন এবং সূচিগুলি বুঝতে হবে এবং সেগুলি সঠিকভাবে কনফিগার করা দরকার - স্ট্রিং ট্রান্সফর্মেশনগুলির মতো LOWER()বা একটি স্বেচ্ছাসেবীর COLLATEধারাটি একটি সূচককে সম্পূর্ণভাবে বাইপাস করতে পারে এবং সময়ের সাথে সাথে, আপনার টেবিলটি বাড়ার সাথে সাথে এর কঠোর পারফরম্যান্সের প্রভাব থাকতে পারে। সম্ভবত আপনি এই ব্যবহারকারী নাম ব্যবহার করছেন? কেস-সংবেদনশীল কোলেশন ব্যবহার করুন এবং কলামে একটি অনন্য সূচক যুক্ত করুন। ব্যবহার করুন EXPLAINনিশ্চিত যে সূচক ব্যবহার করা হচ্ছে করতে।
mindplay.dk

1
আমি মাইন্ডপ্লে.ডকে হিসাবে একই কথা বলতে যাচ্ছিলাম ... উপরের () এবং নিম্ন () নীচে সূচি বাইপাস করে এবং সরাসরি বড় ডেটাবেস টেবিলগুলিতে কর্মক্ষমতা প্রভাবিত করে।
জিটিডোরভ

আমি মাইন্ডপ্লে.ডিকে এবং জিটিডোরভের মতামত উভয়তেই একমত। যেখানে ক্লজটিতে লক্ষ্য কলামে কিছু পদ্ধতি ব্যবহার করে সাবধান হন। কলামের সূচিটি অকেজো হতে পারে। ব্যাখ্যা দিন!
ট্র্যাপার

51

বিনয়ের ব্যবহার করুন

এটি একটি সহজ নির্বাচন

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

এটি বাইনারি সহ একটি নির্বাচন

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

অথবা

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0


3
কখন বিনয়ের ব্যবহার করা = (কেবল মাই টেবিল থেকে বাইনারি যেখানে কিছু 'বিন্দু' = 'কিছু') এর একদিকে যেমন ব্যবহার করা বুদ্ধিমান?
জিমি

@ জিমি আপনি কি বলতে চান? কোড কাজ করে। যখন তুলনার এক পক্ষ বাইনারিতে কাস্ট করা হয় তখন তুলনাটি বাইনারি হয়ে যায়।
জোরি

@ জোরি ওহ, আমি অনুমান করি আমি ভুলভাবে পড়েছি - আমি ভেবেছিলাম যে দুটি উদাহরণগুলির মধ্যে একটির সমান দু'দিকেই বিনারি রয়েছে।
জিমি

আমি ঠিক এটিকে ভোট দিয়েছি কারণ এটি সত্যই সঠিক উত্তর। মাইএসকিউএল ওয়েবসাইটে ডকুমেন্টেশন অনুসারে তারা বলেছে যে আপনার শব্দ / অনুরোধ নির্দিষ্ট ভাষায় টাইপস্ট করার চেষ্টা করার চেয়ে বিনের কমান্ডটি ব্যবহার করা ভাল, কারণ বিনারি কমান্ড বলেছে যে সবকিছু ঠিক তেমন রেখে দেয় এবং ঠিক তেমন ব্যবহার করতে পারে এটি উপস্থাপন করা হয়। সুতরাং যখন আমি উত্তর অনুসন্ধান করতে এসেছি - এখানকার দুটি উত্তর আমাকে মাইএসকিউএল ওয়েবসাইট এবং তাদের ডকুমেন্টেইনটি দেখার জন্য পরিচালিত করেছিল। বিনারি ব্যবহার করা আরও ভাল। অনুবাদ অন্য সমস্যা হতে পারে।
মার্ক ম্যানিং

43

তুলনাগুলি ক্ষেত্রে সংবেদনশীল হয় যখন কলামটি একটি সমষ্টি ব্যবহার করে যা শেষ হয় _ci(যেমন ডিফল্ট latin1_general_ci কোলিশেশন) এবং কলামটি সংবেদনশীল হয় যখন কলামটি একটি সমষ্টি ব্যবহার করে যা শেষ হয় _csবা _bin(যেমন utf8_unicode_csএবং utf8_binকোলিশেশন) এর সাথে শেষ হয় ।

কোলেশন পরীক্ষা করুন

আপনি আপনার সার্ভার , ডাটাবেস এবং সংযোগ কোলিশনগুলি ব্যবহার করে এটি পরীক্ষা করতে পারেন :

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

এবং আপনি এটি ব্যবহার করে আপনার টেবিলের জোট পরীক্ষা করতে পারেন :

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

কোলেশন পরিবর্তন করুন

আপনি আপনার ডাটাবেস, টেবিল বা কলামের সংযোগকে সংবেদনশীল কিছু হিসাবে পরিবর্তন করতে পারেন:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

আপনার তুলনাগুলি এখন কেস-সংবেদনশীল হওয়া উচিত।


25

WHERE বাক্যাংশে স্ট্রিং তুলনা কেস সংবেদনশীল নয়। আপনি ব্যবহার করে তুলনা করতে চেষ্টা করতে পারেন

WHERE `colname` = 'keyword'

অথবা

WHERE `colname` = 'KeyWord'

এবং আপনি একই ফলাফল পাবেন । এটি মাইএসকিউএল-এর ডিফল্ট আচরণ।

আপনি যদি তুলনাটি কেস সংবেদনশীল হতে চান তবে আপনি এটির COLLATEমতো যুক্ত করতে পারেন :

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

এই এসকিউএল এটির সাথে আলাদা ফলাফল দেবে: যেখানে colnameল্যাটিন 1_ জেনারাল_সিএস = 'কীওয়ার্ড' কল করুন

latin1_general_cs বেশিরভাগ ডাটাবেসে সাধারণ বা ডিফল্ট কোলেশন।


16

আপনি যে কোলেশনটি চয়ন করেছেন সেটি সেট করে আপনি কেস সংবেদনশীল কিনা sets


9

ডিফল্টটি কেস সংবেদনশীল, তবে পরবর্তী সর্বাধিক গুরুত্বপূর্ণ বিষয়টি আপনাকে প্রথমে সারণীটি কীভাবে তৈরি করা হয়েছিল তা লক্ষ্য করা উচিত, কারণ আপনি সারণীটি তৈরি করার সময় আপনি কেস সংবেদনশীলতা নির্দিষ্ট করতে পারেন।

নীচের স্ক্রিপ্টটি একটি সারণী তৈরি করে। নীচে নীচে লক্ষ্য করুন এটিতে "কল্টেট লাটিন 1_ জেনারাল_সিএস" লেখা আছে। এর শেষে সিএস মানে কেস সেনসিটিভ। আপনি যদি চান যে আপনার টেবিলটি সংবেদনশীল হতে পারে আপনি হয় সেই অংশটি ছেড়ে চলে যাবেন বা "কল্টেট ল্যাটিন 1_ জেনারাল_সি" ব্যবহার করবেন।

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

যদি আপনার প্রকল্পটি এমন হয় যে আপনি নিজের টেবিলটি তৈরি করতে পারেন তবে আপনি সারণীটি তৈরি করার সময় আপনার কেস সংবেদনশীলতা পছন্দটি নির্দিষ্ট করে তোলা অর্থবোধ করে।


3

এসকিউএল নির্বাচন ক্ষেত্রে সংবেদনশীল নয়।

এই লিঙ্কটি আপনাকে কীভাবে সংবেদনশীল তা দেখাতে পারে: http://web.archive.org/web/20080811231016/http://sqlserver2000.datedias.aspfaq.com:80/how-can-i-make-my- SQL-প্রশ্নের-কেস-sensitive.html


4
আপনার ডাটাবেসের উপর নির্ভর করে, এখানে অন্য কোথাও নির্দেশিত হিসাবে তারা মাইএসকিএলে থাকতে পারে।
বিকিরক


2

নোট করুন যে টেবিলের নামগুলি লিনাক্সের ক্ষেত্রে সংবেদনশীল, যদি না আপনি lower_case_table_nameকনফিগার নির্দেশকে 1 তে সেট করেন । এর কারণ, টেবিলগুলি ফাইল দ্বারা প্রতিনিধিত্ব করা হয় যা লিনাক্সের ক্ষেত্রে সংবেদনশীল।

বিশেষত উইন্ডোজের বিকাশের বিষয়ে সতর্ক থাকুন যা সংবেদনশীল নয় এবং যেখানে উত্পাদন রয়েছে সেখানে মোতায়েন করা হচ্ছে। উদাহরণ স্বরূপ:

"SELECT * from mytable" 

টেবিলের বিপরীতে মাই টেবিল উইন্ডোজে সফল হবে তবে লিনাক্সে ব্যর্থ হবে, যদি না উপরোক্ত নির্দেশনা সেট না করা হয়।

এখানে রেফারেন্স: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html


1
+1 - সংবেদনশীল প্রশ্নগুলি লেখার এবং তারপরে লিনাক্সগুলিতে ব্যর্থ হওয়ার দৃশ্যটি আমাদের প্রকল্পে অনেক ঘটেছে
Vic

@ ভিক আমার প্রকল্পের সাথে আমারও একই সমস্যা রয়েছে। আপনি দয়া করে আমাকে বলবেন কীভাবে আপনি এটি ঠিক করেছেন?
কামরান আহমেদ

@ কামরান আহমেদ, আপনি তৈরির স্ক্রিপ্টগুলিতে যেমন টেবিলের নাম প্রকাশিত হবেন তেমন আবরণ ব্যবহার করতে হবে
ভিক

@ ভিক যেটিই সর্বশেষ অবলম্বন হবে, কেননা আমাকে আক্ষরিক অর্থেই অনেক প্রশ্নের সমাধান করতে হবে। আমি ভাবছিলাম, যদি এটি করার কোনও সহজ উপায় থাকে। ধন্যবাদ যদিও!
কামরান আহমেদ

@ কামরান আহমেদ, lower_case_table_nameআমরা যে উত্তরটির নিচে মন্তব্য করছি তার মধ্যে উল্লিখিত মতগুলি পরিবর্তন করার চেষ্টা করুন
ভিক

1

বর্তমানে গৃহীত সমাধানটি বেশিরভাগ ক্ষেত্রেই সঠিক।

যদি আপনি একটি ননবাইনারি স্ট্রিং ব্যবহার করেন (CHAR, VARCHAR, TEXT), তুলনাগুলি ডিফল্ট কোলিশ অনুযায়ী কেস-সংবেদনশীল

আপনি যদি বাইনারি স্ট্রিং (বিনারি, ভারবাইনারি, ব্লগ) ব্যবহার করেন তবে তুলনাগুলি কেস-সংবেদনশীল, তাই আপনাকে LOWERঅন্যান্য উত্তরে বর্ণিত হিসাবে ব্যবহার করতে হবে ।

আপনি যদি ডিফল্ট কোলেশন ব্যবহার না করে থাকেন এবং আপনি একটি ননবাইনারি স্ট্রিং ব্যবহার করছেন তবে কেস সংবেদনশীলতাটি নির্বাচিত কোলেশন দ্বারা সিদ্ধান্ত নেওয়া হয়।

সূত্র: https://dev.mysql.com/doc/refman/8.0/en/ کیس- সেনসেটিভিটি html । নিবিড়ভাবে পড়ুন। অন্য কেউ কেউ এটি ভুলভাবে বলেছে যে তুলনাগুলি অবশ্যই কেস-সংবেদনশীল বা সংবেদনশীল। এই ক্ষেত্রে না হয়.


0

আপনি চেষ্টা করতে পারেন. আশা করি এটি কার্যকর হবে।

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

0

বাইনারি পতাকা সেট সহ স্ট্রিং ক্ষেত্রগুলি সর্বদা ক্ষেত্রে সংবেদনশীল থাকবে। আপনার কোনও বাইনারি পাঠ্য ক্ষেত্রের ক্ষেত্রে কেস সংবেদনশীল অনুসন্ধানের প্রয়োজন এটি ব্যবহার করুন: ফলস্বরূপ 'পরীক্ষা' রেগেক্সপ বাইনারি 'টেস্ট' নির্বাচন করুন;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.