성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그런 부분은 클라우드 업체 쪽에 문의를 하는 것이 더 좋지 않을...
[정성태] 정적 분석과 함께, 이제는 실행 시 성능 분석까지 (비록 Azu...
[정성태] .NET Source Browser를 이용해 Roslyn 소스 ...
[정성태] Experimental C# Interceptors: AOT &...
[정성태] .NET Conf 2023 (Day 2) - Tiny, fast...
[정성태] The end of the Tye Experiment #1622...
[정성태] This is a simple app that converts ...
[정성태] Wrathmark: An Interesting Compute W...
[정성태] FFmpeg Filters Every Youtuber Needs...
[정성태] 일단, PInvokeStackImbalance 오류가 발생했다는...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - DB에 저장한 텍스트의 (이모티콘을 비롯해) 유니코드 문자가 '?'로 보인다면?</h1> <p> 마침 제 블로그에 이모티콘을 사용한 덧글이 달렸는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C#에서 확인해 보는 관리 힙의 인스턴스 구조 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1176'>https://www.sysnet.pe.kr/2/0/1176</a> </pre> <br /> 화면에 "감사합니다 ??"라고 출력이 됩니다. 음... 이참에 고쳐야겠군요. ^^<br /> <br /> 이를 위해 우선 데이터베이스의 테이블 구조 먼저 살펴봐야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Manage Unicode Characters in Data Using T-SQL ; <a target='tab' href='https://www.sqlshack.com/manage-unicode-characters-in-data-using-t-sql/'>https://www.sqlshack.com/manage-unicode-characters-in-data-using-t-sql/</a> </pre> <br /> 따라서, 해당 텍스트를 담을 칼럼의 데이터 타입이 NText, NChar, NVarchar인지 확인하고 아니라면 그렇게 바꿉니다. 방법은 ALTER 쿼리를 사용해도 되는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ALTER TABLE (Transact-SQL) ; <a target='tab' href='https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql'>https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql</a> </pre> <br /> 가령 comment를 담는 필드 이름이 memoText라고 했을 때 다음과 같은 식으로 쿼리를 수행합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ALTER TABLE MyTable ALTER COLUMN memoText NTEXT NOT NULL; </pre> <br /> 그런데, 실제로 해보면 오류가 발생할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Msg 4927, Level 16, State 1, Line 1 Cannot alter column 'memoText' to be data type text. </pre> <br /> 이 오류를 우회하려면 <a target='tab' href='https://stackoverflow.com/questions/750877/alter-column-datatype-in-sql'>다양한 방법</a>이 있겠지만, 우선 NVARCHAR(MAX)로 변경 후 NTEXT로 재차 변경하면 오류가 발생하지 않습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ALTER TABLE MyTable ALTER COLUMN memoText NVARCHAR(MAX) NOT NULL; ALTER TABLE MyTable ALTER COLUMN memoText NTEXT NOT NULL; </pre> <br /> 혹은, SSMS 도구에서 테이블 디자인 창을 이용해 직접 변경하면 아주 쉽게 처리할 수 있습니다. (단, 이때 <a target='tab' href='https://www.sysnet.pe.kr/2/0/11166'>"Prevent saving changes that require table re-creation" 옵션을 해제</a>해야 합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> DB 변경이 완료되었으면 이제 SqlCommand에 지정하는 SqlParameter의 데이터 타입도 그에 맞게 변경해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SqlParameter[] parameters = { // ...[생략]... new SqlParameter("@memoText", <span style='color: blue; font-weight: bold'>SqlDbType.NText</span>), }; </pre> <br /> 끝입니다. 이렇게 변경하면 이후 저장하는 데이터는 모두 정상적으로 저장 및 복원이 되어 화면까지 잘 출력이 됩니다. 그래서 현재 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/1176'>C#에서 확인해 보는 관리 힙의 인스턴스 구조</a>" 글의 덧글에 있는 이모티콘이 정상으로 보여지고 있습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, SQL 서버에서 ntext, text, image는 권장하지 않고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ntext, text, and image (Transact-SQL) ; <a target='tab' href='https://learn.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql'>https://learn.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> <span style='color: blue; font-weight: bold'>IMPORTANT!</span> ntext, text, and image data types will be removed in a future version of SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. <span style='color: blue; font-weight: bold'>Use nvarchar(max), varchar(max), and varbinary(max) instead.</span> </div><br /> <br /> 그래도 아직까지는 Azure의 SQL 데이터베이스도 그렇고 여전히 해당 타입을 지원하고 있습니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1817
(왼쪽의 숫자를 입력해야 합니다.)