Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

स्ट्रिंग्स की तुलना पहले खाली स्थान वाले एक के साथ की जाती है जबकि दूसरे में नहीं है

CHAR प्रकार स्ट्रिंग को फ़ील्ड की लंबाई तक भरते हैं नल बाइट्स के साथ (जबकि VARCHAR स्ट्रिंग के अंत को इंगित करने के लिए सीमांकक जोड़ते हैं - इस प्रकार अंत में अतिरिक्त डेटा को अनदेखा करते हैं (मेरा मतलब खाली बाइट्स है )), और इसलिए जिन तुलनाओं के अंत में रिक्त स्थान हैं, वे उन पर ध्यान नहीं देंगे। प्रमुख रिक्त स्थान प्रासंगिक हैं क्योंकि वे स्वयं स्ट्रिंग को बदलते हैं। क्रिस्टोफर का उत्तर देखें।

संपादित करें:कुछ और विस्तार की आवश्यकता है

नीचे कुछ व्यावहारिक परीक्षण देखें। VARCHAR प्रकार स्ट्रिंग में रिक्त स्थान जोड़ते हैं, जबकि CHAR फ़ील्ड, भले ही वे रिक्त स्थान के साथ स्ट्रिंग को उसके आकार तक भरते हैं, तुलना के दौरान उन्हें अनदेखा करते हैं। विशेष रूप से दूसरी पंक्ति देखें LENGTH . के साथ फ़ंक्शन क्वेरी:

mysql> create table test (a VARCHAR(10), b CHAR(10));
Query OK, 0 rows affected (0.17 sec)

mysql> insert into test values ('a', 'a'), ('a ', 'a '), (' a', ' a');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select a, LENGTH(a), b, LENGTH(b) FROM test;
+------+-----------+------+-----------+
| a    | LENGTH(a) | b    | LENGTH(b) |
+------+-----------+------+-----------+
| a    |         1 | a    |         1 | 
| a    |         2 | a    |         1 | 
|  a   |         2 |  a   |         2 | 
+------+-----------+------+-----------+
3 rows in set (0.00 sec)

जहां MySQL CHAR फ़ील्ड को 'ए' के ​​मान के साथ बताता है, जैसा कि इसे डाला गया था, इसकी लंबाई में केवल 1 वर्ण है। इसके अलावा, अगर हम थोड़ा सा डेटा जोड़ते हैं:

mysql> select CONCAT(a, '.'), CONCAT(b, '.') FROM test;
+----------------+----------------+
| CONCAT(a, '.') | CONCAT(b, '.') |
+----------------+----------------+
| a.             | a.             | 
| a .            | a.             | 
|  a.            |  a.            | 
+----------------+----------------+
3 rows in set (0.00 sec)

mysql> select CONCAT(a, b), CONCAT(b, a) FROM test;
+--------------+--------------+
| CONCAT(a, b) | CONCAT(b, a) |
+--------------+--------------+
| aa           | aa           | 
| a a          | aa           | 
|  a a         |  a a         | 
+--------------+--------------+
3 rows in set (0.00 sec)

आप देख सकते हैं कि, चूंकि VARCHAR स्टोर करता है जहां स्ट्रिंग समाप्त होती है, स्पेस कॉन्सटेनेशन पर रहता है - जो CHAR प्रकारों के लिए सही नहीं है। अब, पिछले LENGTH . को ध्यान में रखते हुए उदाहरण के लिए, जहां पंक्ति दो के क्षेत्र a और b के लिए अलग-अलग लंबाई है, हम परीक्षण करते हैं:

mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a    | b    |
+------+------+
| a    | a    | 
| a    | a    | 
|  a   |  a   | 
+------+------+
3 rows in set (0.00 sec)

इसलिए, हम यह कहते हुए संक्षेप में कह सकते हैं कि CHAR डेटाटाइप अपनी स्ट्रिंग के अंत में अतिरिक्त स्थान की उपेक्षा करता है और ट्रिम करता है, जबकि VARCHAR नहीं करता है - सिवाय तुलना के दौरान को छोड़कर :

mysql> select a from test where a = 'a ';
+------+
| a    |
+------+
| a    | 
| a    | 
+------+
2 rows in set (0.00 sec)

mysql> select a from test where a = 'a';
+------+
| a    |
+------+
| a    | 
| a    | 
+------+
2 rows in set (0.00 sec)

mysql> select a from test where a = ' a';
+------+
| a    |
+------+
|  a   | 
+------+
1 row in set (0.00 sec)

तो, क्या CHAR प्रकार के लिए भी यही सच है?

mysql> select a from test where b = 'a ';
+------+
| a    |
+------+
| a    | 
| a    | 
+------+
2 rows in set (0.00 sec)

mysql> select a from test where b = 'a';
+------+
| a    |
+------+
| a    | 
| a    | 
+------+
2 rows in set (0.00 sec)

mysql> select a from test where b = ' a';
+------+
| a    |
+------+
|  a   | 
+------+
1 row in set (0.00 sec)

जो प्रदर्शित करता है कि CHAR और VARCHAR प्रकारों में अलग-अलग भंडारण विधियां हैं, लेकिन सरासर स्ट्रिंग तुलना के लिए समान नियमों का पालन करें . अनुगामी रिक्त स्थान पर ध्यान नहीं दिया जाता है; जबकि प्रमुख स्थान स्ट्रिंग को स्वयं संशोधित करते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLSTATE [HY000] [1698] उपयोगकर्ता 'रूट' @ 'लोकलहोस्ट' के लिए प्रवेश निषेध

  2. CSV से MySQL DB में डेटा सम्मिलित करना बहुत धीमा है

  3. शामिल होने पर अलग रिकॉर्ड चुनें

  4. चुनिंदा फॉर्म के साथ mysql पर स्पेसिफिक कॉलम में चेकबॉक्स वैल्यू डालने के लिए PHP कोड

  5. टाइमस्टैम्प फ़ील्ड की समय सीमा समाप्त होने के बाद MySQL को ऑटो अपडेट कैसे करें