SQL Collation: 无法存储俄语字符,即使它们已经存在于列中。

huangapple go评论66阅读模式
英文:

SQL Coalation: Cannot store russian character, even if they already were in the column

问题

在此行中:

SQL Collation: 无法存储俄语字符,即使它们已经存在于列中。

您可以看到,在“描述”列内已保存了俄语字符集。

现在,如果我字面上复制表内已有的内容,并执行以下操作:

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;

结果如下:

SQL Collation: 无法存储俄语字符,即使它们已经存在于列中。

因此,很明显,在将俄语字符串存储在此列中时必须使用了一种技巧,因为它已经接受俄语值。

这个技巧可能是什么?

此外,当我执行以下操作时:

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:

SQL Collation: 无法存储俄语字符,即使它们已经存在于列中。

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:

SQL Collation: 无法存储俄语字符,即使它们已经存在于列中。

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.

huangapple
  • 本文由 发表于 2023年7月12日 20:41:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/76670676.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定