समस्या यह है कि MySQL स्ट्रिंग तुलना करते समय पिछली सफेद जगह को अनदेखा करता है। देखेंhttp://dev.mysql.com/doc/refman/ 5.7/hi/char.html
(यह जानकारी 5.7 के लिए है; 8.0 के लिए यह बदल गया है, नीचे देखें)
like
. के लिए अनुभाग ऑपरेटर इस व्यवहार के लिए एक उदाहरण देता है (और दिखाता है कि like
पिछली सफेद जगह का सम्मान करता है):
mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
| 1 | 0 |
+------------+---------------+
1 row in set (0.00 sec)
दुर्भाग्य से UNIQUE
ऐसा लगता है कि इंडेक्स मानक स्ट्रिंग तुलना का उपयोग यह जांचने के लिए करता है कि पहले से ही ऐसा कोई मान है, और इस प्रकार पिछली सफेद जगह को अनदेखा करता है। यह VARCHAR
का उपयोग करने से स्वतंत्र है या CHAR
, दोनों ही मामलों में सम्मिलित अस्वीकार कर दिया गया है, क्योंकि अद्वितीय जांच विफल हो जाती है। अगर like
. का उपयोग करने का कोई तरीका है UNIQUE
. के लिए शब्दार्थ जाँच करें तो मुझे इसकी जानकारी नहीं है।
आप क्या कर सकते हैं मान को VARBINARY
. के रूप में संग्रहीत करें :
mysql> create table test_ws ( `value` varbinary(255) UNIQUE );
Query OK, 0 rows affected (0.13 sec)
mysql> insert into test_ws (`value`) VALUES ('a');
Query OK, 1 row affected (0.08 sec)
mysql> insert into test_ws (`value`) VALUES ('a ');
Query OK, 1 row affected (0.06 sec)
mysql> SELECT CONCAT( '(', value, ')' ) FROM test_ws;
+---------------------------+
| CONCAT( '(', value, ')' ) |
+---------------------------+
| (a) |
| (a ) |
+---------------------------+
2 rows in set (0.00 sec)
बेहतर होगा कि आप इस कॉलम पर वर्णानुक्रम में क्रमबद्ध करने जैसा कुछ नहीं करना चाहते, क्योंकि इसके बजाय बाइट मानों पर छँटाई होगी, और यह वह नहीं होगा जिसकी उपयोगकर्ता अपेक्षा करते हैं (अधिकांश उपयोगकर्ता, वैसे भी)।
विकल्प यह है कि MySQL को पैच करें और अपना खुद का संयोजन लिखें जो कि NO PAD प्रकार का है। सुनिश्चित नहीं है कि कोई ऐसा करना चाहता है, लेकिन यदि आप करते हैं, तो मुझे बताएं;)
संपादित करें:इस बीच MySQL में कोलाज हैं जो कि NO PAD प्रकार के हैं, के अनुसार https://dev.mysql.com/doc/refman/8.0/hi/char.html :
और https://dev.mysql.com/ doc/refman/8.0/hi/charset-unicode-sets.html
तो अगर आप कोशिश करते हैं:
create table test_ws ( `value` varbinary(255) UNIQUE )
character set utf8mb4 collate utf8mb4_0900_ai_ci;
आप रिक्त स्थान के साथ और उसके बिना मान सम्मिलित कर सकते हैं
आप इसके साथ सभी उपलब्ध नो पैड कोलाज पा सकते हैं:
show collation where Pad_attribute='NO PAD';