<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Ali Momen</title><link>https://virgool.ir/feed/@m_78664212</link><description></description><language>fa</language><pubDate>2026-11-11 11:50:44</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>Ali Momen</title><link>https://virgool.ir/@m_78664212</link></image><item><title>بهترین پیشنهاد برای تنظیم Collation فارسی در SQL Server 2019</title><link>https://virgool.ir/@m_78664212/بهترین-پیشنهاد-برای-تنظیم-collation-فارسی-در-sql-server-2019-ebknuqu8jzot</link><description>سلام!! در SQL Server اگر بعد از ریختن اطلاعات، Collation رو برای varchar از لاتین به فارسی اصلاح کنیم اطلاعات فارسی ما از بین میرن و قابل بازیابی نیستند و باید دوباره insert بشن. حتی بعضی موقع ها باید جدول رو drop کنیم و دوباره بسازیم و truncate یا delete کردن اون هم مشکلو حل نمیکنه و اطلاعات بعدی که ریخته میشوند (حتی با درست بودن collation) از بین میرن. البته رفتار SQL Server در مورد Collation فارسی خیلی خیلی inconsistent هست و best practice این هست که هنگام ساختن database اگر collation سرور فارسی نیست (منظور من از فارسی نبودن لاتین هست)، collation دیتابیس رو همان موقع فارسی تنظیم کنیم.در هر صورت این را هم می دانیم که nvarchar همواره اطلاعات را به جز sort صحیح آن تحت هر Collation ای برای نوشته فارسی صحیح نگه می دارد و صحبت ما اینجا در مورد varchar است. واضح است که اگر هم همیشه از nvarchar استفاده میکنید برای sort صحیح باید تنظیم Collation صحیح را رعایت کنید.تست اطلاعات و collation فارسی در SQL Server 2019اسکریپت عکس بالا:use mastergoalter database test_collationset single_user with rollback immediatedrop database test_collationgocreate database test_collationgo-------- changing database collation to Latinalter database test_collationcollate SQL_Latin1_General_CP1_CI_ASuse test_collationdrop table if exists t1create table t1 (t1c1 uniqueidentifier primary key not null , t1c2 varchar(100) collate Persian_100_CI_AS, t1c3 varchar(100))goinsert into t1 (t1c1,t1c2,t1c3) values (newid(),N&#39;علی&#39;,N&#39;رضا&#39;)goselect DATABASEPROPERTYEX(&#39;test_collation&#39;,&#39;collation&#39;) DBCollationselect * from t1-------- changing database collation to Persianalter database test_collationcollate Persian_100_CI_AS-------- insert after database collation changeinsert into t1 (t1c1,t1c2,t1c3) values (newid(),N&#39;علی&#39;,N&#39;رضا&#39;)select * from t1-------- reinsert data after table truncationtruncate table t1insert into t1 (t1c1,t1c2,t1c3) values (newid(),N&#39;علی&#39;,N&#39;رضا&#39;)select * from t1-------- Reading data with low-level data access commands to see if the original inserted unicode data can be recovered or notcreate table [page] (ParentObject nvarchar(255), [Object] nvarchar(255), Field nvarchar(255), [VALUE] nvarchar(255))declare @PageNumber intSELECT @PageNumber = (select top 1 cast(parsename(replace(sys.fn_PhysLocFormatter(%%PhysLoc%%),&#39;:&#39;,&#39;.&#39;),2) as int) from t1)declare @sql nvarchar(max) = &#39;DBCC PAGE(&#39;&#39;test_collation&#39;&#39; , 1 , &#39;+cast(@PageNumber as nvarchar(4))+&#39; , 3) WITH TABLERESULTS&#39;insert into [page]exec (@sql)select (select ascii(VALUE) from page where Field =&#39;t1c2&#39;) as [t1c2], (select ascii(VALUE) from page where Field =&#39;t1c3&#39;) as [t1c3]-- 63 is ascii code for &#39;?&#39;-------- drop and create table t1 again and reinserting the valuesdrop table t1create table t1 (t1c1 uniqueidentifier primary key not null , t1c2 varchar(100) collate Persian_100_CI_AS, t1c3 varchar(100))goinsert into t1 (t1c1,t1c2,t1c3) values (newid(),N&#39;علی&#39;,N&#39;رضا&#39;)select * from t1-------- create table t2 with identical definitiondrop table if exists t2create table t2 (t2c1 uniqueidentifier primary key not null , t2c2 varchar(100), t2c3 varchar(100))goinsert into t2 (t2c1,t2c2,t2c3) values (newid(),N&#39;علی&#39;,N&#39;رضا&#39;)select * from t2goموفق باشید</description><category>Ali Momen</category><author>Ali Momen</author><pubDate>Thu, 22 Jul 2021 14:45:41 +0430</pubDate></item></channel></rss>