यह व्यवहार डिज़ाइन द्वारा है, न केवल MySQL में।
आप BINARY
का उपयोग करके तुलना में यह आस-पास काम कर सकते हैं:
mysql> select version(), 'a' = 'a ', BINARY 'a' = BINARY 'a ';
+-------------+------------+--------------------------+
| version() | 'a' = 'a ' | BINARY 'a' = BINARY 'a ' |
+-------------+------------+--------------------------+
| 5.5.25a-log | 1 | 0 |
+-------------+------------+--------------------------+
1 row in set (0.00 sec)
लेकिन नहीं भी बहुत कुछ। यदि आपको व्हाइटस्पेस दिखाई देते हैं तो यह आपको SELECT
एस के साथ मदद करेगा। एक खोज में उपयोगकर्ता इनपुट में; लेकिन यदि आप वास्तव में व्हाइटस्पेस-ट्राइल्ड जानकारी इनपुट करना चाहते हैं, तो यह एक समस्या होगी (आपके पास 'ए' और 'ए' दोनों के साथ एक इंडेक्स नहीं हो सकता है)।
भी
Trailing whitespace in varchar needs to be considered in comparison
देखें आप सकता है क़यास रिवर्स उस कॉलम में तार, और उन्हें वापस रिवर्स जब उन्हें प्रदर्शित करना। बेशक यह उस कॉलम के आधार पर किसी ऑर्डरिंग को तोड़ देगा, लेकिन यदि आप केवल समानता या घटते अस्तित्व का परीक्षण करते हैं, तो यह सिर्फ काम कर सकता है। अग्रणी रिक्त स्थान गिनते हैं।
समानता खोजों के लिए आप स्ट्रिंग के बेस 64 एन्कोडिंग को भी स्टोर कर सकते हैं, जिसे लेक्सिकोोग्राफिक ऑर्डर को बनाए रखना चाहिए (यानी, ए और बी के बीच ऑर्डर बेस 64 (ए) और बेस 64 (बी) के बीच बनाए रखा जाना चाहिए)। या आप स्ट्रिंग पर टर्मिनेटर जोड़ सकते हैं ("\ n" अच्छी तरह से कर सकता है और खोजों में दिखाई नहीं दे सकता है)।
अंत में
, लेकिन यह जोखिम भरा है, क्योंकि मनुष्य अंतर नहीं बता सकते हैं, आप UTF8 चार (49,824) के साथ रिक्त स्थान की जगह सकता है:
mysql> select concat ('\'a', char(49824),'\'') AS tricked,
concat ('\'a', ' ' ,'\'') as honest,
concat ('\'a', char(49824),'\'') =
concat ('\'a', ' ' ,'\'') as equals;
+---------+--------+--------+
| tricked | honest | equals |
+---------+--------+--------+
| 'a ' | 'a ' | 0 |
+---------+--------+--------+
1 row in set (0.00 sec)
पंक्तियों लगते बराबर हो, लेकिन वे नहीं कर रहे हैं । ध्यान दें कि HTML में स्थान एक स्थान है, और 49824
(nonbreaking space) है। यह उन कार्यों को प्रभावित करता है जो एचटीएमएल में परिवर्तित होते हैं, और वास्तव में एक यूटीएफ 8 कोडपॉइंट का मतलब है कि ईमानदार स्ट्रिंग दो बाइट्स है, लेकिन की लंबाई स्ट्रिंग वास्तव में तीन है।
अंत में आप VARCHAR
के बजाय कॉलम VARBINARY
घोषित कर सकते हैं, इस प्रकार पूरी तरह से छिपाने के लिए क्या हो रहा है। यह सबसे आसान समाधान की तरह दिखता है, लेकिन मुझे डर है कि यह आपको लाइन के नीचे कुछ हफ्तों या महीनों काट सकता है।
मुझे एहसास है कि ज्यादातर परिस्थितियों में एक डीबी अग्रणी और पिछली जगहों को हटाना चाहेगा, लेकिन मेरे मामले में वे महत्वपूर्ण हैं। मेरे मामले में '' (2 रिक्त स्थान) और '' (3 रिक्त स्थान) मान्य इनपुट हैं और मुझे उनके बीच अंतर करने की आवश्यकता है, वे हैं कि मैं तालिका कैसे खोजूंगा। तो इस जानकारी के आधार पर किसी भी SQL langugaes समाधान नहीं हो सकता है? क्या मैं जो खोज रहा हूं उसे पूरा करने का कोई तरीका है? मैं mySQL में बंद नहीं हूँ। दुर्भाग्य से मेरे इनपुट में लीइंग और पीछे की जगहें हो सकती हैं। – taggedzi
'ऐसे कई हैक्स संभव हैं' ... मैंने कुछ सूचीबद्ध किए हैं। दुर्भाग्यवश, कोई भी स्कॉट- या जोखिम मुक्त नहीं है। – LSerni
जानकारी के लिए धन्यवाद मैं बेस 64 एन्कोडिंग का उपयोग कर सकता हूं, मैं पूरी तरह से भूल गया कि मैंने इसे कुछ समय में उपयोग नहीं किया है। धन्यवाद, मैं देखूंगा कि क्या यह काम करता है। – taggedzi