Я был удивлен, что не смог найти прямой ответ на этот вопрос, выполнив поиск.Как хранить и извлекать расширенные символы ASCII в MSSQL
У меня есть веб-приложение на PHP, которое вводит пользователя. Из-за характера приложения пользователи могут часто использовать расширенные символы ASCII (a.k.a. «ALT-коды»).
Моя конкретная проблема на данный момент - это код ALT 26, который является стрелкой вправо (→). Это будет сопровождаться другим текстом, который будет храниться в одном поле (например, 'this→that'
).
Мой тип колонки - NVARCHAR.
Вот что я пробовал:
Я пытался не делать никаких преобразований и просто вставить значение в обычном режиме, но значение получает хранится в
thisâ??that
.Я попытался преобразовать значение в UCS-2 в PHP, используя
iconv('UTF-8', 'UCS-2', $value)
, но я получаю сообщение об ошибкеUnclosed quotation mark after the character string 't'.
. Запрос заканчивается следующим образом:UPDATE myTable SET myColumn = 'this�!that'
.Я попытался выполнить вышеуказанное преобразование, а затем добавил N до цитируемого значения, но получаю то же сообщение об ошибке. Запрос выглядит так:
UPDATE myTable SET myColumn = N'this�!that'
.Я попытался удалить конверсию UCS-2 и просто добавить N перед цитируемым значением, и запрос снова работает, но значение сохраняется как
thisâ that
.Я попытался использовать
utf8_decode($value)
в PHP, но затем стрелка только что заменена вопросительным знаком.
Так может кто-нибудь ответить на (казалось бы, простой) вопрос о том, как я могу хранить это значение в моей базе данных, а затем восстановить его, как он был набран?
Я использую PHP 5.5 и MSSQL 2012. Если какой-либо вопрос о версии драйвера/ОС входит в игру, это сервер Linux, подключающийся через FreeTDS. Нет возможности изменить это.
Уверены, что значение, хранящееся на сервере sql, неверно? SSMS не всегда делает хорошую работу по отображению символов в расширенном наборе. Вы можете проверить фактическое значение unicode этого символа. Похоже, что есть что-то на стороне PHP, которую вы должны сделать, чтобы сделать это действительным для расширенного набора символов. –
Чтобы ответить на это: «Я пробовал использовать utf8_decode ($ value) в PHP, но затем стрелка просто заменяется вопросительным знаком.», Это, вероятно, потому, что нет представления для этого значения в ISO-8859-1 кодировок. utf8_decode преобразует строки в кодировку ISO-8859-1. – georaldc
@SeanLange: Когда значение извлекается из базы данных для отображения в приложении, оно отображается, как я упоминал (сломан). – Travesty3