SQL සේවාදායකයේ එක් උපුටා දැක්වීමකින් මා ගැලවෙන්නේ කෙසේද?


982

මම 9 insertහි වගුවකට පෙළ දත්ත කිහිපයක් උත්සාහ කරමි SQL Server.

පා text යට තනි උපුටා දැක්වීමක් (') ඇතුළත් වේ.

මම එයින් බේරෙන්නේ කෙසේද?

මම තනි උපුටා දැක්වීම් දෙකක් භාවිතා කිරීමට උත්සාහ කළ නමුත් එය මට යම් දෝෂයක් ඇති කළේය.

උදා. insert into my_table values('hi, my name''s tim.');


30
"එය මට යම් දෝෂයක් ඇති කළා" - මෙම දෝෂ මොනවාද?
llamaoo7

ඔව්, මන්ද MSSQL හි තනි උපුටා දැක්වීම් ඇතුළත් කිරීමට නිවැරදි ක්‍රමය ඒවා දෙගුණ කිරීමයි. ඔබ අපට පෙන්වන ආදර්ශය ක්‍රියාත්මක විය යුතුය. කුමන භාෂාවෙන්ද ඔබ මෙම SQL විමසුම කරන්නේ කෙසේද? නැතහොත් එය SQL සේවාදායක කළමනාකරණ චිත්‍රාගාරයේ තිබේද?
මැක්සි වීට්

Answers:


1437

ඔබගේ උදාහරණයෙන් ඔබ අපට පෙන්වා ඇති ආකාරයටම, තනි මිල ගණන් දෙගුණ කිරීමෙන් ගැලවී යයි . පහත දැක්වෙන SQL මඟින් මෙම ක්‍රියාකාරීත්වය විදහා දක්වයි. මම එය SQL Server 2008 හි පරීක්ෂා කළෙමි:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

ප්රතිපල

value
==================
hi, my name's tim.

17
මම මගේ ගැටලුව විසඳීමට වැරදි ස්ථානය දෙස බලා සිටියෙමි. එය චරිතයෙන් ගැලවීමේ ගැටලුවක් නොවීය. මගේ ගැටලුව වූයේ දත්ත දිග සීමාව ඉක්මවා තිබීමයි. තනි උපුටා දැක්වීම දෙවරක් භාවිතා කිරීම චරිතයෙන් ගැලවීමට නිවැරදි මාර්ගය බව මට සහතික කිරීමට ස්තූතියි.
tim_wonil

ඉතින්, මට වචන 10k අඩංගු පෙළක් තිබේ නම් එය අවශ්‍ය වනු ඇත මම මගේ සියලුම පෙළ ප්‍රතිස්ථාපනය කරමි?
විනිසියස් ලීමා

3
In විනීසියස් ලීමා: කෙටි පිළිතුර ඔව්. දත්ත ගබඩා කිරීම සඳහා ඔබ භාවිතා කිරීමට යන තාක්ෂණය මත පදනම්ව එය ඇත්ත වශයෙන්ම වෙනස් වේ. ඔබ ORM භාවිතා කරන්නේ නම් එය ඔබ වෙනුවෙන් කරනු ඇත. ඔබ ඔබේ SQL විධානයන් අතින් ගොඩනඟන්නේ නම්, භාෂාවේ “සූදානම් කළ ප්‍රකාශ” ක්‍රියාකාරිත්වය භාවිතා කිරීමට ඔබට අවශ්‍ය වනු ඇත. ඔබ එය කළමණාකරන චිත්‍රාගාරයේ කරන්නේ නම් ඔබට එය ප්‍රතිස්ථාපනය කිරීමට සිදුවේ.
Cᴏʀʏ

1
එනම් එකක් සඳහා තනි උපුටා දැක්වීම් දෙකක්. [''] => [']
උජ්වාල් සිං

70

ඔබගේ තනි උපුටා දැක්වීම වෙනත් තනි උපුටා දැක්වීමකින් ගැලවීම ඔබ වෙනුවෙන් වැඩ නොකරන්නේ නම් (එය මගේ මෑත විමසුමකට සමාන REPLACE()නොවූවාක් මෙන්), ඔබට SET QUOTED_IDENTIFIER OFFඔබේ විමසුමට පෙර භාවිතා කළ හැකිය , SET QUOTED_IDENTIFIER ONපසුව ඔබේ විමසුමෙන් පසුව.

උදාහරණයක් වශයෙන්

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
සාමාන්‍යයෙන් මම දෙගුණ කිරීමේ ප්‍රවේශය භාවිතා කරමි, නමුත් මම ගතික SQL උත්පාදනය කරන විට බහු සේවාදායක සහ දත්ත සමුදායන් හරහා ක්‍රියාත්මක වන අතර, මෙම විසඳුම මා වෙනුවෙන් ක්‍රියාත්මක වූ අතර දෙගුණ කිරීම එක් විශේෂිත අවස්ථාවකදී සිදු නොවීය. මේ සඳහා ස්තූතියි!
රිචඩ් මොස්

ගණනය කළ තීරුවල අදහස් සහ දර්ශක යොමු කිරීමේදී ප්‍රවේශම් වන්න, නැතහොත් ඔබට දෝෂයක් ඇතිවිය හැකිය. stackoverflow.com/questions/9235527/…
datagod

Ic රිචඩ් මොස්, +1. ඔබත් එසේමයි. ආරම්භක විසඳුම දෙගුණ කිරීමේ ප්‍රවේශයයි. බහුවිධ සේවාදායකයන් හරහා ගතික SQL වැනි සංකීර්ණ විමසුම් සඳහා, මෙය ක්‍රියාත්මක වනු ඇත, දෙගුණ කළ ප්‍රවේශය නොතිබිය හැකිය
එඩ්ගර් ඇලන් බයිරන්


18

උපුටා දැක්වීම දෙගුණ කිරීම වැඩ කළ යුතුව තිබුණි, එබැවින් එය ඔබ වෙනුවෙන් වැඩ නොකිරීම සුවිශේෂී ය; කෙසේ වෙතත්, විකල්පයක් වන්නේ නූල් වටා තනි අක්ෂර වෙනුවට ද්විත්ව උපුටා දැක්වීම් භාවිතා කිරීමයි. එනම්,

insert into my_table values("hi, my name's tim.");


5
පා text යේ තනි සහ ද්විත්ව උපුටා දැක්වීම් තිබේ නම් කුමක් කළ යුතුද? ක්ෂේත්‍ර නාම සඳහා පමණක් ද්විත්ව මිල ගණන් වෙන් කර නොමැතිද?
ලාජෝස් මෙසාරොස්

12

මේ සඳහා වැඩ කළ හැකි ක්‍රම 2 ක්:


සඳහා 'ඔබ හුදෙක් උදා, වැල එය දෙගුණ කළ හැකි select 'I''m happpy'- ලැබෙනු ඇත:I'm happy


ඕනෑම චරිතයක් සඳහා ඔබට විශ්වාස නැත: වර්ග සේවාදායකයෙන් ඔබට ඕනෑම වර්‍ගයක යුනිකෝඩ් එකක් ලබා ගත හැකිය select unicode(':')(ඔබ අංකය තබා ගන්න)

එබැවින් මෙම නඩුව ඔබට ද කළ හැකිය select 'I'+nchar(39)+'m happpy'


6

පරිස්සම් විය යුතු තවත් දෙයක් නම්, එය සැබවින්ම සම්භාව්‍ය ASCII '(ASCII 27) හෝ යුනිකෝඩ් 2019 ලෙස ගබඩා කර තිබේද නැද්ද යන්නයි (එය සමාන පෙනුමක් ඇති නමුත් සමාන නොවේ).

මෙය ඇතුළත් කිරීම් පිළිබඳ විශාල ගනුදෙනුවක් නොවේ, නමුත් එයින් තේරීම් සහ යාවත්කාලීන කිරීම් පිළිබඳ ලෝකය අදහස් කළ හැකිය.
එය යුනිකෝඩ් අගය නම්, 'WHERE වගන්තියකින්' පැන යාම (උදා: blah = 'කම්කරුවන්ගේ කොම්පෝ') ඔබ සොයන අගය මෙන් නැවත පැමිණේ නම් "සේවක කොම්පෝ" හි ඇත්ත වශයෙන්ම තිබේ නම් යුනිකෝඩ් අගය.

ඔබේ සේවාදායක යෙදුම නිදහස් යතුර සඳහා සහය දක්වන්නේ නම්, පිටපත් කිරීම හා පදනම් කරගත් ආදානය පිටපත් කිරීම, එය පේළි කිහිපයක යුනිකෝඩ් විය හැකි අතර අනෙක් ඒවා ASCII විය හැකිය!

මෙය සනාථ කිරීම සඳහා සරල ක්‍රමයක් නම්, ඔබ සොයන වටිනාකම නැවත ගෙන එන යම් ආකාරයක විවෘත විමසුමක් කිරීමෙන් පසුව එය නොට්පෑඩ් ++ හෝ වෙනත් යුනිකෝඩ් ආධාරක සංස්කාරකයකට පිටපත් කර අලවන්න.

Ascii අගය සහ යුනිකෝඩ් එක අතර වෙනස් පෙනුම ඇස්වලට පැහැදිලිව පෙනිය යුතුය, නමුත් ඔබ ගුදය දෙසට නැඹුරු නම් එය හෙක්ස් සංස්කාරකයක 27 (ascii) හෝ 92 (යුනිකෝඩ්) ලෙස පෙන්වනු ඇත.


5

තනි මිල ගණන් මග හැරීමේ ජනප්‍රිය ක්‍රමය පහත පරිදි පහසුවෙන් දෙගුණ කිරීම බව අප බොහෝ දෙනෙක් දනිමු.

PRINT 'It''s me, Arul.';

තනි මිල ගණන් ක්‍රමය දෙගුණ කිරීම

අපි තනි උපුටා දැක්වීම් වලින් ගැලවීමේ වෙනත් විකල්ප ක්‍රම සොයා බලමු.

1. යුනිකෝඩ් අක්ෂර

39 යනු තනි උපුටා දැක්වීමේ යුනිකෝඩ් චරිතයයි. එබැවින් අපට එය පහත පරිදි භාවිතා කළ හැකිය.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

යුනිකෝඩ් අක්ෂර

2.QUOTED_IDENTIFIER

තවත් සරල හා හොඳම විකල්ප විසඳුමක් වන්නේ QUOTED_IDENTIFIER භාවිතා කිරීමයි. QUOTED_IDENTIFIER OFF ලෙස සකසා ඇති විට, නූල් ද්විත්ව උපුටා දැක්වීම් සමඟ සම්බන්ධ කළ හැකිය. මෙම තත්වය තුළ, අපට තනි උපුටා දැක්වීම් වලින් ගැලවීමට අවශ්‍ය නැත. එබැවින්, තනි උපුටා දැක්වීම් සමඟ නූල් අගයන් විශාල ප්‍රමාණයක් භාවිතා කරන අතරම මෙම ක්‍රමය ඉතා ප්‍රයෝජනවත් වනු ඇත. තීරු අගයන් තනි උපුටා දැක්වීම් සහිත INSERT / UPDATE ස්ක්‍රිප්ට් පේළි බොහොමයක් භාවිතා කරන අතරතුර එය බෙහෙවින් උපකාරී වනු ඇත.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

නිගමනය

ඉහත සඳහන් ක්‍රම AZURE සහ On Premises යන දෙකටම අදාළ වේ.


1

පහත දැක්වෙන වාක්‍ය ඛණ්ඩය ඔබට එක් උද්ධෘත ලකුණක් පමණක් මග හැරෙනු ඇත:

SELECT ''''

ප්රති result ලය තනි උපුටා දැක්වීමක් වනු ඇත. ගතික SQL නිර්මාණය කිරීම සඳහා ඉතා ප්‍රයෝජනවත් විය හැක :). රූප විස්තරය මෙහි ඇතුළත් කරන්න


0

මෙය ක්‍රියාත්මක විය යුතුය

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

ඕනෑම දෙයක් ඇතුළත් කිරීමට පෙර 'ඇතුළු කරන්න. එය sqlServer හි ගැලවීමේ චරිතයක් මෙන් වනු ඇත

උදාහරණය: ඔබට ක්ෂේත්‍රයක් ඇති විට, මම හොඳින් . ඔබට කළ හැකිය: UPDATE my_table SET row = 'මම හොඳින්.';


OP හරියටම කළේ එයම නොවේද, ඉහළම ඡන්දය දුන් පිළිතුර දැනටමත් පවසන ආකාරයටමද? දෝෂයේ වෙනත් ප්‍රභවයක් තිබිය හැක.
මයිකල් මැක්ස්කිල්

0

ද්විත්ව උපුටා දැක්වීම් විකල්පය මට උදව් විය

SET QUOTED_IDENTIFIER OFF;
insert into my_table values("hi, my name's tim.");
SET QUOTED_IDENTIFIER ON;

-3

මෙය ක්‍රියාත්මක විය යුතුය: පසුපස කප්පාදුවක් භාවිතා කර ද්විත්ව උපුටා දැක්වීමක් කරන්න

"UPDATE my_table SET row =\"hi, my name's tim.\";

ඔයා අදහස් කරන්නේ කුමක් ද? ඔබ කියන්නේ PRINT \"hi, my name's tim.\";එය SSMS හි වැඩ කිරීමට යන බවයි? එය කිසිසේත් ක්‍රියාත්මක නොවන අතර එය ක්‍රියාත්මක වන බව කිසිවෙකු පවසා නැත.
මොහොමඩ් මුසාවි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.