اذهب إلى المحتوى
  • 0

هل يوجد خوارزمية تختصر سلسلة نصية في SQL Server

Naser ناصر

السؤال

السلام عليكم ورحمة الله
يوجد لدي قائمة سلسلة حرفية  .... مثال لواحد منها  

101-01-21-4192B

  فهل يوجد خوارزمية  تختصره الى رموز صغير مثلا يصبح ( Ae18) وهكذا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

نعم هذ بالضبط ما اريده

من اجل طباعة الباركود فالنص الأصلي 

101-01-21-4192B عند طباعة الباركود له يصبح الباركود كبير وصعب القراءة بقارئ الباركود

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 30 دقائق مضت قال Saeed عبدالله:

انا اصدر البيانات من قاعدة البيانات الى TEXT FILE ثم اطبع الباركود

اطبع الباركود من محرر النصوص المفكرة

لو امكن عمل FUNCTION بـ SQL SERVER 

هل الغرض هو الحماية و تشفير معرف المنتجات؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Saeed عبدالله:

لا

عليك ذكر أي تفاصيل تساع على اختيار الحل الأمثل للمشكلة، 

ماذا سوف يفيدك النص المختصر؟ وضعه على باركود فقط؟ لأي هدف؟ تصويره من هاتف و جلب بيانات ما أو ماذا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اخي العزيز انسى موضوع طباعة الباركود ركز على موضوع الدالة التي تحول النص 

101-01-21-4192B

 الى رمز مختصر مثلا

Ae18

ودالة أخرى تعكس العملية

مع الشكر

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكن إعادة ترميز النص لنمط آخر، مثل Base64 وهو يحوي أحرف و أرقام .. باستعمال الطريقة التالية

--String to Base64
SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
             ^^^^^^
               النص


--Base64 to String
SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )
                    ^^^^^^^^
                      ناتج الجزء الأول المشفر

أو الشيفرة التالية:

declare @source varbinary(max), @encoded varchar(max), @decoded varbinary(max) -- مدخلات و مخرجات
set @source = convert(varbinary(max), 'Hello From Hsoub')                    -- نص نريد تشفيره
set @encoded = cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')    -- نص مشفر
set @decoded = cast('' as xml).value('xs:base64Binary(sql:variable("@encoded"))', 'varbinary(max)') -- فط التشفير

-- استعلام يعمل على جدوللترميز و  فك الترميز
select
convert(varchar(max), @source) as source_varchar,
@source as source_binary,
@encoded as encoded,
@decoded as decoded_binary,
convert(varchar(max), @decoded) as decoded_varchar

في حال أردت ضغط النص:

تقدم SQL server دالتين لضغط و فك ضغط النصوص وهما بالشكل العام التالي

COMPRESS ( expression )

DECOMPRESS ( expression ) 

مثال للتنفيذ:

SELECT COMPRESS ('WELCOME To Hsoub') AS Compressed_Value

سوف تنتج التعليم السابقة نص مشفر مضغوط.

لفك الضغط، نستعمل الدالة المعاكسة مع تمرير ناتج الدالة الأولى لها

SELECT DECOMPRESS (0x1F8B0800000000......) AS Decompressed_Value
                 // ^^^^^^^^^^^^^^^^^^^^^
                   Compressed_Value
                   WELCOME To Hsoub

سوف يتم إعادة النص الأول وهو WELCOME To Hsoub كناتج فك الضغط. يمكنك تجريب هذه الدالة

  • تستخدم خوارزمية GZIP لضغط السلاسل النصية.
  • إن مفهوم ضغط النصوص أمر يتعلق بخوارزمية الضغط و تكرار المحارف ضمن النص نفسه حيث كلما زاد تكرار الحروف يزداد معدل الضغط و ينقص حجم النص المضغوط الناتج
  • يمكن ألا يكون النص المضغوط دوماً أصغر من النص الأصلي
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا لك اخي الكريم لكن هذا ليس المطلوب ، هذا شيء اخر غير المطلوب ، ارجع وتأمل السؤال والمطلوب جيدا

ارجوا من باقي الاخوة المساعدة مع الشكر للجميع

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 50 دقائق مضت قال Saeed عبدالله:

شكرا لك اخي الكريم لكن هذا ليس المطلوب ، هذا شيء اخر غير المطلوب ، ارجع وتأمل السؤال والمطلوب جيدا

ارجوا من باقي الاخوة المساعدة مع الشكر للجميع

ما اظن انك تريد القيام به هو سحب البيانات من الـ db ومن ثم  اختصارها وتقديمها مختصرة وبعد ذلك تقديم الباركود المختصر عبر الباركود ثم فك الاختصار في الحهة المقابلة بعد قراءة الباركود.

اظن انه ستحصل على نفس النتيجة في حال قمت بالاختصار بعد الحصول على البيانات من الـ db في مرحلة قبل عرض الباركود يعني في الباك اند، ان كان بإمكانك مشاركة الباك إند الذي تعمل عليه فهناك العديد من الدوال التي تقوم بإختصار النصوص في اغلب لغات البرمجة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

شكرا على الرد..... لا يا اخي ليس هذا المطلوب .... هذه دوال تشفير وانا لا اريد تشفير

اريد فقط دالة تختصر وتقلل الحجم من (101-01-21-4192B ) هذه طولها 15 خانة

اريد اختصارها الى مثلا (Ae18) هنا اصبح طولها 4 خانات

 

ملاحظة .......انظر ماذا صنع التشفير 0x3130312D30312D32312D3431393242

وهذا عكس المطلوب

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 17 دقائق مضت قال Saeed عبدالله:

اريد اختصارها الى مثلا (Ae18) هنا اصبح طولها 4 خانات

هل يمكنك مشاركة ما تعيده 

SELECT CAST('101-01-21-4192B' as varbinary(max)) FOR XML PATH(''), BINARY BASE64

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال Saeed عبدالله:

شكرا على الرد..... لا يا اخي ليس هذا المطلوب .... هذه دوال تشفير وانا لا اريد تشفير

اريد فقط دالة تختصر وتقلل الحجم من (101-01-21-4192B ) هذه طولها 15 خانة

اريد اختصارها الى مثلا (Ae18) هنا اصبح طولها 4 خانات

 

ملاحظة .......انظر ماذا صنع التشفير 0x3130312D30312D32312D3431393242

وهذا عكس المطلوب

وهل يمكن التعبير عن 101-01-21-4192B بـ Ae18 من دون استخدام قاعدة بيانات تخبرك بأن Ae18 يساوي 101-01-21-4192B.
لا اعتقد ان هنالك دالة عكوسة يمكنها تحويل اي قيمة تدخلها إلى شيفرة ب اربع خانات فقط إلا انه هنالك دوال تقوم بهذه الوظيفة ولكنها تسبب فقد في البيانات حيث لا يمكنك استعادة البيانات الاصلية قبل عملية التشفير.

يبدو لي ان الحل الوحيد لمشكلتك إذا اردت استخدام طريقة ال Ae18  هي تخزين قاعدة بيانات تخبرك بأن Ae18 يساوي 101-01-21-4192B في الطرف الاخر الذي سيتلقى البيانات المشفرة وهكذا كل ما علينا هو تمرير ال Ae18 وترجمته  إلى 101-01-21-4192B بعد وصوله.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Saeed عبدالله:

لذلك انا أسال فلربما يوجد Formula جاهزة تصلح للعمل كدالة تقوم بهذا المطلوب أو يمكن انشائها من قبل الاخوة المحترفين هنا

لا اعتقد انه يمكن ان يوجد مثل هذه الدالة التي تطلبها، لكن اظن انه يمكننا التغلب على المشكلة التي تواجهها من دون الاعتماد على هذه الدالة الاسطورية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال Saeed عبدالله:

اريد فقط دالة تختصر وتقلل الحجم من (101-01-21-4192B ) هذه طولها 15 خانة

اريد اختصارها الى مثلا (Ae18) هنا اصبح طولها 4 خانات

عليك فهم السلسلة النصية كترميز من المعلومات، كل محرف فيها يمثل معلومة، 

لاختصار طول السلسلة يمكن أن تقوم بإعادة ترميز للمحارف فقط، وهي عملية ضغط النص.

لا يمكن احتواء نفس المعلومات ضمن سلسلة نصية أخرى أقصر بدون عمل ضغط و فك ضغط لمنع خسارة المعلومات. 

وفي حال قمت بترميز نص طوله 15 كنص طوله 4 سيحدث تصادم collision أي نفس النص القصير سوف يرمز لنصين أو أكثر من الطويل

الأبجدية لديك فيها حرف وهو B مثلاً ، فلا يمكن توسيعها لعدم وجود محارف غير أرقام وحروف أي base 64.

محاولة أخرى، 

جرب عمل القصر ل 36 محرف

SELECT cast(column as char(36)) as char36

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...