কিভাবে আমি MySQL এ SQL কেস সংবেদনশীল স্ট্রিং তুলনা করতে পারি?



interop case-sensitive (7)

আমি একটি ফাংশন আছে মিশ্র মিশ্রিত সঙ্গে পাঁচ অক্ষর ফেরত। যদি আমি এই স্ট্রিংয়ের উপর একটি প্রশ্ন করি তবে এটি ক্ষেত্রে নির্বিশেষে মূল্য ফেরত দেবে।

কিভাবে আমি MySQL স্ট্রিং প্রশ্নের ক্ষেত্রে সংবেদনশীল করতে পারি?


= অপারেটর ব্যবহার করার পরিবর্তে, আপনি লাইক বা লাইক ব্যানার ব্যবহার করতে চাইতে পারেন

// this returns 1 (true)
select 'A' like 'a'

// this returns 0 (false)
select 'A' like binary 'a'


select * from user where username like binary 'a'

এটি এ অবস্থায় 'a' এবং 'A' গ্রহণ করবে


BINARY ব্যবহার করার আগে একটি সূচকের ব্যবহার করতে, যদি আপনার বড় টেবিল থাকে তবে আপনি এটির মতো কিছু করতে পারেন।

SELECT
   *
FROM
   (SELECT * FROM `table` WHERE `column` = 'value') as firstresult
WHERE
   BINARY `column` = 'value'

Subquery একটি ছোট কেস-অসংবেদী উপসেট যার ফলে আপনি শুধুমাত্র কেস সংবেদনশীল সংবেদনশীল নির্বাচন নির্বাচন করবে।


অসাধারণ!

আমি আপনার সাথে ভাগ করে নেব, একটি ফাংশন থেকে কোড যা পাসওয়ার্ড তুলনা করে:

SET pSignal =
(SELECT DECODE(r.usignal,'YOURSTRINGKEY') FROM rsw_uds r WHERE r.uname =
in_usdname AND r.uvige = 1);

SET pSuccess =(SELECT in_usdsignal LIKE BINARY pSignal);

IF pSuccess = 1 THEN
      /*Your code if match*/
ELSE
      /*Your code if don't match*/

END IF;

আপনি এই মত সংবেদনশীল সংবেদনশীল ক্ষেত্রে ব্যানার ব্যবহার করতে পারেন

select * from tb_app where BINARY android_package='com.Mtime';

দুর্ভাগ্যক্রমে এই এসকিউএল সূচক ব্যবহার করতে পারে না, আপনি যে সূচক নির্ভরশীল প্রশ্নের উপর একটি কর্মক্ষমতা আঘাত ভোগ করবে

mysql> explain select * from tb_app where BINARY android_package='com.Mtime';
+----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+
|  1 | SIMPLE      | tb_app | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1590351 |   100.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+---------+----------+-------------+

ভাগ্যক্রমে, আমি এই সমস্যা সমাধানের জন্য কয়েক কৌশল আছে

mysql> explain select * from tb_app where android_package='com.Mtime' and BINARY android_package='com.Mtime';
+----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
| id | select_type | table  | partitions | type | possible_keys             | key                       | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | tb_app | NULL       | ref  | idx_android_pkg           | idx_android_pkg           | 771     | const |    1 |   100.00 | Using index condition |
+----+-------------+--------+------------+------+---------------------------+---------------------------+---------+-------+------+----------+-----------------------+  

ডিবি স্তরের কিছু পরিবর্তন করার দরকার নেই, কেবলমাত্র এটিতে কাজ করার জন্য আপনাকে SQL ক্যোয়ারিতে পরিবর্তন করতে হবে।

উদাহরণ -

"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";

বাইনারি শব্দ ক্ষেত্রে সংবেদনশীল করা হবে।


নিম্নলিখিত মাইএসকিউএল সংস্করণ 5.5 বা সমান বা তার চেয়ে বেশি।

/Etc/mysql/my.cnf যুক্ত করুন

  [mysqld]
  ...
  character-set-server=utf8
  collation-server=utf8_bin
  ...

আমি চেষ্টা সমস্ত অন্যান্য সংঘর্ষ কেস-অসংবেদী বলে মনে হচ্ছে, শুধুমাত্র "utf8_bin" কাজ।

এই পর mysql পুনরায় আরম্ভ করতে ভুলবেন না:

   sudo service mysql restart

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html মতে একটি "latin1_bin" রয়েছে।

"Utf8_general_cs" mysql স্টার্টআপ দ্বারা গৃহীত হয় নি। (আমি "_cs" হিসাবে "কেস সংবেদনশীল" - ???) পড়ি।


http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

ডিফল্ট চরিত্র সেট এবং সংযোজন latin1 এবং latin1_swedish_ci হয়, সুতরাং অবাধ্য স্ট্রিং তুলনা ডিফল্টরূপে কেস অসংবেদক। এর অর্থ হল যদি আপনি col_name 'a%' লাইক দিয়ে অনুসন্ধান করেন, আপনি সমস্ত কলামের মান পাবেন যা A বা A দিয়ে শুরু হয়। এই অনুসন্ধানের কেসটি সংবেদনশীল করতে, অপারেডগুলির একটিতে কেস সংবেদনশীল বা বাইনারি সংযোজন আছে তা নিশ্চিত করুন। উদাহরণস্বরূপ, যদি আপনি একটি কলাম এবং একটি স্ট্রিংয়ের সাথে তুলনা করছেন যা উভয়টি latin1 অক্ষর সেট থাকে তবে আপনি অপারেডটি latin1_general_cs বা latin1_bin সংযোজন করার জন্য COLLATE অপারেটরটি ব্যবহার করতে পারেন:

col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin

কেস-সংবেদনশীল ফ্যাশনের ক্ষেত্রে যদি আপনি কলামটি সর্বদা চিকিত্সা করতে চান তবে এটি একটি কেস সংবেদনশীল বা বাইনারি সংহতকরণের সাথে ঘোষণা করুন।






string-comparison