Mysql строка varbinary типа и недопустимые символы - PullRequest
0 голосов
/ 24 декабря 2011

К сожалению, я обрезал свою таблицу, и когда я хочу импортировать резервную копию, у меня возникают проблемы со строкой типа VARBINARY(24).

Что с этим не так?

Я хочу, чтобы мое поле было таким: ŔÎĹͳ׼ųÎ070905-121713

Но когда я использую следующий запрос:

UPDATE `proto` 
SET `vname` = 'ŔÎĹͳ׼ųÎ070905-121713 ' 
WHERE `id` = 127;

Запрос выполняется без ошибок, но затем я делаю:

SELECT `vname` 
FROM `proto` 
WHERE `id` = 127;

И я вижу, что мое поле vname содержит следующие данные:

c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039

вместо

ŔÎĹͳ׼ųÎ070905-121713.

Что не так с этим и почему я не могу установить свои полевые данные в: ŔÎĹͳ׼ųÎ070905-121713?

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Ваша строка является строкой Unicode.Он закодирован в кодировке utf-8, которая может использовать несколько байтов для одного символа.Итак, ваша строка соответствует следующей последовательности байтов:

c5 94 c3 8e c4 b9 c3 8d c5 82 c3 97 c4 bd c4 b9 c5 82 c3 8e 30 37 30 39 30 35 2d 31 32 31 37 31 33

Ваш столбец объявлен как VARBINARY (24), поэтому ваши данные не помещаются в столбец и обрезаются.Хранится только 24 байта:

c5 94 c3 8e c4 b9 c3 8d c5 82 c3 97 c4 bd c4 b9 c5 82 c3 8e 30 37 30 39

Это то, что вы видите.

Чтобы решить эту проблему, установите тип столбца VARCHAR (24), чтобы ограничение применялось к количеству символов, а не байтов.Установите кодировку для вашей таблицы на «utf-8».Если вы можете установить кодировку соединения, пусть оно также будет «utf-8» (похоже, это уже «utf-8»).Тогда все будет хорошо.

Если вы не хотите, чтобы ваш столбец VARCHAR, вы можете просто удвоить емкость вашего VARBINARY.Пусть это будет VARBINARY (48).Но я не рекомендую это.Хотя большинство 24-символьных строк в кодировке utf-8 будут вмещаться в 48 байтов, некоторые из них не будут (поскольку некоторые экзотические символы могут занимать более 2 байтов. Теоретически длина одного символа в utf-8 может составлять до6 байтов! Очень редко, хотя ...).Если вы сделаете столбец VARCHAR, это будет лучшим вариантом, потому что на самом деле вы помещаете туда текст, а не двоичные данные.

1 голос
/ 24 декабря 2011

При передаче двоичных данных в виде последовательности символов могут возникнуть проблемы с кодировкой.Сервер должен выяснить, какие двоичные данные вы имеете в виду, когда отправляете «ŔÎĹÍł × ĽĹłÎ070905-121713», и это зависит от кодировки, выбранной для вашего соединения.Попробуйте проверить, правильно ли это.

В общем, я предпочитаю передавать двоичные данные в шестнадцатеричном виде (например, x'123AB45CD789EF0123 '), но, насколько я понимаю, у вас уже есть резервная копия таблицы, где хранятся данныепредставлены в виде символов, так что это не вариант для вас.

...