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

MySQL बिना डेटा खोए CHAR(32) डेटाटाइप को BINARY(16) में बदलें

ऐसा लगता है कि आप एक यूयूआईडी को हेक्साडेसिमल अंकों की एक स्ट्रिंग के रूप में प्रस्तुत करना चाहते हैं। इनमें आम तौर पर चार डैश होते हैं इसलिए लंबाई वास्तव में 36 वर्ण होती है। लेकिन अगर आप डैश हटाते हैं, तो यह 32 वर्णों का हो सकता है।

mysql> SELECT UUID();
+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| b4d841ec-5220-11e9-901f-a921a9eb9f5b |
+--------------------------------------+

mysql> SELECT REPLACE(UUID(), '-', '');
+----------------------------------+
| REPLACE(UUID(), '-', '')         |
+----------------------------------+
| d3dbd450522011e9901fa921a9eb9f5b |
+----------------------------------+

लेकिन एक हेक्स स्ट्रिंग में, प्रत्येक दो वर्ण डेटा का प्रतिनिधित्व करते हैं जिसे बाइनरी डेटा के एक बाइट में एन्कोड किया जा सकता है। उदाहरण के लिए, FF 255 के लिए हेक्स मान है, जो एक बाइट का अधिकतम मान है। इसलिए हेक्स स्ट्रिंग्स बाइनरी में समकक्ष डेटा के रूप में दोगुने बाइट्स लेते हैं। यदि स्थान सीमित है, तो हो सकता है कि आप अपने UUID मानों को बाइनरी में बदलना चाहें ताकि आप उन्हें आधे स्थान में संग्रहीत कर सकें।

आप इसे UNHEX() फ़ंक्शन<के साथ कर सकते हैं। /ए> ।

mysql> SELECT UNHEX(REPLACE(UUID(), '-', ''));
+---------------------------------+
| UNHEX(REPLACE(UUID(), '-', '')) |
+---------------------------------+
| $S,vR!??!??[                      |
+---------------------------------+

बाइनरी डेटा मानव-उन्मुख इंटरफेस में प्रदर्शित या टाइप करने के लिए सुखद नहीं है, क्योंकि कुछ बाइट अमुद्रण योग्य वर्णों से मेल खाते हैं।

लेकिन जब आपने ALTER TABLE table_name MODIFY device_uuid BINARY(16) किया था , आपने UNHEX() . के साथ हेक्स स्ट्रिंग्स को डीकोड नहीं किया . सबसे अच्छे रूप में, इसने ASCII हेक्साडेसिमल वर्णों के पहले 16 बाइट्स को आपके BINARY(16) कॉलम के 16 बाइट्स में मैप किया, और इसने उस बिंदु पर स्ट्रिंग को छोटा कर दिया। यह ऐसा है जैसे आपने हर पंक्ति में ऐसा किया हो:

mysql> SELECT LEFT(REPLACE(UUID(), '-', ''), 16);
+------------------------------------+
| LEFT(REPLACE(UUID(), '-', ''), 16) |
+------------------------------------+
| 364e6db8522211e9                   |
+------------------------------------+

पहले 16 बाइट्स अभी भी हेक्साडेसिमल अंक हैं। बाइट्स उन अंकों के लिए ASCII मान हैं, अंकों की प्रत्येक जोड़ी के बाइनरी समकक्ष नहीं। प्रत्येक स्ट्रिंग के बाद के 16 बाइट्स को छोटा कर दिया गया, और संग्रहीत नहीं किया गया। यदि वह डेटा महत्वपूर्ण था, तो मुझे आशा है कि आपके पास अपने डेटाबेस का बैकअप होगा, क्योंकि उस बैकअप को पुनर्स्थापित करना अब एकमात्र तरीका है जिससे आप उस डेटा को पुनर्प्राप्त कर सकते हैं।

आपको जो करना चाहिए था वह निम्नलिखित है:

ALTER TABLE table_name ADD COLUMN device_uuid_bin BINARY(16);
UPDATE table_name SET device_uuid_bin = UNHEX(device_uuid);

...check the data to make sure the conversion worked... 
...test any applications work with the binary data... 

ALTER TABLE table_name DROP COLUMN device_uuid;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अल्पविराम से अलग किए गए फ़ील्ड के साथ MySQL समूहीकरण

  2. mysql2 मणि ​​गलत mysql क्लाइंट लाइब्रेरी के लिए संकलित है

  3. mysql श्रेणियां और उपश्रेणियां लिस्टिंग

  4. क्या मैं एक MySQL तालिका में कॉलम नामों के लिए डिफ़ॉल्ट मान वापस प्राप्त कर सकता हूं?

  5. SQL दिनांक अंतराल क्वेरी