英文:
SQL Coalation: Cannot store russian character, even if they already were in the column
问题
在此行中:
您可以看到,在“描述”列内已保存了俄语字符集。
现在,如果我字面上复制表内已有的内容,并执行以下操作:
UPDATE [SystemLocalization]
SET Description = '<p>Дополнительная форма для другого внешнего вида продукта</p>
<ul>
<li>Величина порции: 350 г</li>
<li>Длина порции: 150 мм</li>
<li>Ширина порции: 120 мм</li>
<li>Высота порций: 25 мм</li>
<li>Диаметр отверстий концевой решетки: 3 мм</li>
<li>Тара: Лоток</li>
<li>Наружные размеры лотка ДxШxВ: 195 x 144 x 51 см</li>
</ul>'
WHERE Id = 3179;
结果如下:
因此,很明显,在将俄语字符串存储在此列中时必须使用了一种技巧,因为它已经接受俄语值。
这个技巧可能是什么?
此外,当我执行以下操作时:
SELECT COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SystemLocalization'
AND COLUMN_NAME = 'Description';
我得到的结果是:Latin1_General_CI_AS
。
英文:
I have this row:
You see, inside the column "description" there is already a russian character set saved.
Now if I literally COPY what is already inside that table and do:
UPDATE [SystemLocalization]
SET Description = '<p>Дополнительная форма для другого внешнего вида продукта</p>
<ul>
<li>Величина порции: 350 г</li>
<li>Длина порции: 150 мм</li>
<li>Ширина порции: 120 мм</li>
<li>Высота порций: 25 мм</li>
<li>Диаметр отверстий концевой решетки: 3 мм</li>
<li>Тара: Лоток</li>
<li>Наружные размеры лотка ДxШxВ: 195 x 144 x 51 см</li>
</ul>
'
WHERE Id = 3179;
The result is this:
So clearly, there must have been used a trick while storing the russian string inside this column, as it already accepts russian values.
What might this trick be?
Also; when I do this:
SELECT COLUMN_NAME, COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SystemLocalization'
AND COLUMN_NAME = 'Description';
I am getting: Latin1_General_CI_AS
答案1
得分: 1
需要在字符串文字前添加N
前缀,以便SQL Server知道该字符串文字包含Unicode文本:
将SET Description = '<p>Д...
更改为SET Description = N'<p>Д...
。
像这样:
UPDATE [SystemLocalization]
SET Description = N'<p>Дополнительная форма для другого внешнего вида продукта</p>
<ul>
<li>Величина порции: 350 г</li>
<li>Длина порции: 150 мм</li>
<li>Ширина порции: 120 мм</li>
<li>Высота порций: 25 мм</li>
<li>Диаметр отверстий концевой решетки: 3 мм</li>
<li>Тара: Лоток</li>
<li>Наружные размеры лотка ДxШxВ: 195 x 144 x 51 см</li>
</ul>
''
WHERE Id = 3179;
否则,该字符串将被解释为varchar
(而不是nvarchar
),它(默认情况下)使用系统代码页,这将导致Unicode数据丢失。
英文:
You need to add a N
prefix to the string-literal to SQL Server knows the string-literal contains Unicode text:
Change SET Description = '<p>Д...
to SET Description = N'<p>Д...
.
Like so:
UPDATE [SystemLocalization]
SET Description = N'<p>Дополнительная форма для другого внешнего вида продукта</p>
<ul>
<li>Величина порции: 350 г</li>
<li>Длина порции: 150 мм</li>
<li>Ширина порции: 120 мм</li>
<li>Высота порций: 25 мм</li>
<li>Диаметр отверстий концевой решетки: 3 мм</li>
<li>Тара: Лоток</li>
<li>Наружные размеры лотка ДxШxВ: 195 x 144 x 51 см</li>
</ul>
'
WHERE Id = 3179;
...otherwise the string will be interpreted as varchar
(not nvarchar
) which (by default) uses the system codepage which will lose Unicode data.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论