Данные по японскому / китайскому языку в таблице SQL Server - PullRequest
3 голосов
/ 20 февраля 2009

Итак, у меня есть интересная проблема, с которой мне нужна помощь быстрее, чем я могу довести свои навыки работы с SQL Server до номинала.

У нас есть таблица, которая содержит кучу текста, все на разных языках. Большая часть этих данных правильно отображается в браузере, однако все, что на китайском или японском, полностью искажается браузером.

Это приложение ASP.old, которое мы используем для отображения данных, поступающих с сервера под управлением MS SQL Server 2005.

Раньше у нас была такая же проблема, и мы решили ее, изменив кодировку на страницах ASP. Эти файлы не изменились с тех пор, как мы это сделали, но проблема вновь возникла. Таким образом, я должен сделать вывод, что проблема связана с базой данных, поскольку это единственное, что было обновлено с тех пор, как мы в последний раз ее исправили.

До сих пор я пытался разобраться в сопоставлении, но я далеко не эксперт по SQL, так что это было сложно.

Я могу предоставить больше информации, если необходимо, что угодно, что поможет кому-то получить ответ, за исключением URL (конфиденциальность и все).

Если у кого-то есть идеи, я был бы очень признателен.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Тип столбца: 'ntext'

Ответы [ 7 ]

4 голосов
/ 20 февраля 2009

Здесь может быть несколько проблем, но, поскольку вы говорите, что решили это раньше, это может быть просто проблема с отображением в браузере. Вы должны убедиться, что у вас правильно установлена ​​кодировка и установлены языковые пакеты. Вы можете проверить это на нескольких разных компьютерах и в браузерах, чтобы определить, является ли это проблемой с конкретным компьютером, браузером или общей проблемой.

Иначе, используете ли вы поля nvarchar или ntext во всех таблицах вашей базы данных? Если нет, то вы теряете китайские и японские символы на этом уровне. Кроме того, если вы используете какие-либо хранимые процедуры, функции и т. Д., Вам необходимо убедиться, что переменные также являются nvarchar или ntext.

Наконец, перепроверьте, что ваши ASP-страницы сохраняют кодировку во всех местах. Я не очень знаком с ASP classic, поэтому позволю кому-то еще помочь с этим.

4 голосов
/ 20 февраля 2009

Сортировка влияет только на порядок сортировки, а не на кодирование. Вам необходимо определить кодировку вашего китайского и японского контента (см. this ). Если это не UCS-2, у вас есть проблема (так как вы не можете поддерживать одновременное кодирование нескольких страниц). Если это UCS-2, вам нужно убедиться, что кодировка вашей страницы ASP также установлена ​​в UTF-8 (и что браузер распознает это, правильно установив кодировку в UTF-8 - см. Просмотр / Кодирование).

Или, проще говоря: если приложение, создавшее контент, не использовало символы Юникода, вам придется переключать кодировку страницы, если вы переключаетесь между китайскими, японскими и европейскими символами.

Если вы правильно закодировали содержимое Unicode в своей базе данных и используете на своих страницах кодировку UTF-8, у вас не должно возникнуть проблем с отображением каких-либо специальных символов (если вы используете шрифт Unicode на странице):

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Я понимаю, что, несмотря на несколько правок, я не очень ясен, поэтому позвольте мне добавить некоторые основы.

Набор символов - это стандартизированное представление набора символов (например, ASCII, UNICODE, ...).

Кодировка символов - это двоичное представление, используемое для хранения символов заданного набора символов. ASCII имеет свою собственную кодировку. Unicode, который является очень большим набором символов, разработанным для поддержки всех существующих символов, имеет несколько кодировок (UTF-8, UTF-16, UCS-2, ...).

Только Unicode дает вам возможность одновременно поддерживать западный и дальневосточный контент с одинаковыми настройками базы данных и приложения. Однако существуют более старые наборы символов для китайского и японского языков, которые не являются Unicode. Если ваш контент не является Unicode (например, BIG 5), вы не можете отобразить его на веб-странице в кодировке UTF-8.

Это может стать сложным, если приложение, создавшее контент, использовало одну кодировку (например, BIG-5), а база данных сохранила его как данные Unicode. Если это произойдет, информация могла быть потеряна.

Вам даже нужно установить соответствующие языковые пакеты в Windows, чтобы правильно видеть символы. К сожалению, проблемы с кодировкой не так просто диагностировать.

1 голос
/ 29 апреля 2009

У вас есть следующее в ваших ASP файлах?

<%@codepage=65001%>
Session.CodePage = 65001
0 голосов
/ 05 мая 2009

Я подозреваю, что у вас есть несколько проблем.

На самом деле существует несколько распространенных способов представления текста на японском и китайском языках с использованием устаревших кодировок (Shift_JIS, EUC-JP и JIS-вариантов для японского и нескольких других для китайского) или Unicode (UTF-8 или UTF-16). , Для многоязычного приложения предпочтительным решением является передача содержимого страницы в UTF-8; Сама Windows предпочитает хранить контент в UTF-16 (именно это NTEXT и NVARCHAR используют в MS SQL Server).

Для того, чтобы японский контент отображался правильно, вам нужно убедиться, что на каждом этапе вашего конвейера данных происходят правильные преобразования. Давайте предположим, что вы собираетесь использовать Unicode ради здравомыслия, но ответ будет аналогичным, если вы намеренно решили использовать Shift-JIS, big5, gb2312 или что-то еще, только более сложное.

Если ваши данные в основном поступают из веб-форм, вам необходимо убедиться, что для вашей кодовой страницы установлено значение 65001, обычно с помощью директивы <% @ codepage = 65001%> в верхней части каждого файла ASP.

Кроме того, вы должны предоставить подсказку вашим пользовательским агентам (веб-браузеру), которые вы используете UTF-8. Есть два метода, один с использованием заголовка HTTP; другой вариант - подделать заголовок HTTP с метатегом.

Решение метатега:

Решение для HTTP-заголовка, использующее мои ржавые навыки ASP (предполагая javascript, но вы, вероятно, используете vbscript, который потребует от вас отказаться от точек с запятой) Response.ContentType = "текст / html"; Response.Charset = "UTF-8";

Если вы берете данные в MSSQL в виде каналов, а не веб-форм, вам также необходимо убедиться, что данные преобразованы правильно. В зависимости от вашего механизма импорта способ указания исходной кодировки может быть разным, поэтому мне придется оставить это как «упражнение для читателя».

Далее, при отправке данных на сервер SQL вам необходимо убедиться, что вы используете правильный механизм ввода SQL. Если вы не параметризуете свои запросы (и должны это делать), вам нужно не забывать использовать форму N'MyText 'вместо «MyText» при вводе текстовых параметров в запросе. Если вы настраиваете свой текст, когда вы используете adVarChar, вы должны использовать вместо него adVarWChar. (Для каждого типа данных ADO существуют соответствующие типы "W").

Кроме того, некоторые браузеры используют атрибут HTML LANG в качестве подсказки для отображения текста подходящим шрифтом для языка контента. Если вы знаете, на каком языке находится ваш контент, вы можете добавить LANG = "ja-jp" к любому элементу HTML (включая BODY). Затем браузер должен использовать разумный шрифт по умолчанию для этого языка (но вы можете явно указать его, если хотите). Большинство браузеров, созданных за последние 5 лет, используют магию связывания шрифтов, даже если вы выбрали неподходящий шрифт по умолчанию для определенного языка, но вы получите более надежные результаты и немного лучшую производительность рендеринга, если будете использовать подходящий шрифт.

В качестве дополнительной заметки Если вы получаете почти правильные результаты при ручном принудительном кодировании в браузере как shift-jis, это означает, что вы, вероятно, используете windows-1252 в качестве набора символов <% @ codepage = 1252%> и вам повезло что содержание не было испорчено полностью. Есть пара хаков, которые могут восстановить шланг Shift-Jis-in-1252 или iso-8859-1, но они не на 100% надежны.

Что касается сортировки на сервере SQL, это имеет два последствия. В полях NVARCHAR и NTEXT это влияет только на сортировку и запросы (включая регистр, акцент и чувствительность к кане) В полях varchar и text это также влияет на кодировку, но это не самое разумное решение вашей проблемы.

0 голосов
/ 04 мая 2009

Если вы изменили базу данных, то наиболее вероятным виновником является хранение полей. Вы можете передать поля через переменную, которая не является ntext, а просто text или varchar. Это уничтожит входящие данные, а затем вернется на веб-страницу неправильно.

Что вы используете для вставки данных в базу данных?

0 голосов
/ 02 мая 2009

Вы сказали, что не можете даже прочитать его из Management Studio. Очень важно проверить, есть ли уже потерянные данные.

Чтобы узнать, как его восстановить, вы должны знать, как он поврежден.

  1. Как эти слова записывались в базу данных? любое транскодирование (в том числе скрытое ASP) было выполнено до его записи в БД?

  2. Что на самом деле уже хранится в базе данных? Вы можете получить первые два / три байта «разбитых» слов и сравнить их диапазон байтов с общей кодировкой.

Если данные поступили из браузера, вам следует проверить кодировку страницы формы. Браузеры используют кодировку страницы для кодирования и отправки данных. Если кодировка / кодировка не соответствует получателю (например, вашей странице ASP), он может неправильно расшифровать слова.

0 голосов
/ 29 апреля 2009

ntext устарел в SQL 2005 (http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx). Не уверен, поможет ли это, но вы можете попробовать преобразовать ntext в nvarchar.

...