LINUX.ORG.RU

MySQL: вопрос про endiannes для целочиленных типов


0

0


MySQL 5.0.4x/i386

вопрос наверное элементарный, но как-то лишь сейчас с ним столкнулся и явного ответа в документации не нашёл :-/

вопрос: при вставке целочисленного значения в таблицу - например UNSIGNED INTEGER - происходит ли автоматическая конвертация данных запроса в тот или иной порядок байт - big/little - или нет?

история: вставляю в базу голый 4х байтный IPv4 адрес в поле типа UNSIGNED INTEGER через prepared statement и хочу его после смотреть SELECT-ом в человечем виде a'la SELECT INET_NTOA(ip) FROM foo;

документация на INET_NTOA() не говорит ничего, на INET_ATON() говорит:

--- cut ---
INET_ATON(expr)

Given the dotted-quad representation of a network address as a string, returns an integer that represents the numeric value of the address. Addresses may be 4- or 8-byte addresses.

mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480

The generated number is always in network byte order. For the example just shown, the number is calculated as 209×2563 + 207×2562 + 224×256 + 40.
--- cut ---

..i.e. я так понимаю, что обе функции предполагают, что целочисленный адрес в базе должен храниться в сетевом порядке. прекрасно. по [моей] идее я так и делаю: подготавливаю выражение, назначаю параметры, в качестве значения поля передаю адрес как unsigned long в сетевом порядке дабы они в нём же и сохранились в базе как этого требует INET_ATON(). все работает на ура за исключением того, что в базе после INSERT-а данные сохраняются в перевёрнутом виде :-/

такое ощущение, что или библиотека клиента или база [что навряд ли] при вставке сама переворачивает значение ожидая при этом, что клиент всегда будет передавать целочисленные параметры выражения в host order.

в принципе, это было бы вполне логично, но явного подтверждения/утверждения в документации я не нашёл. so вопрос: так ли это?

// wbr

функции inet_aton,inet_ntoa не могут предполагать в каком виде адрес будет храниться в базе. Они тупо делают работу по преобразованию переданных им значений и понятия не имеют куда вы эти адреса будете совать.
А кусок кода бы все прояснил.

На примере mysql 4.0 i686
табличка test(a int unsigned);

mysql> insert into test(b) values(inet_aton('209.207.224.40'));
Query OK, 1 row affected (0.00 sec)

mysql> select b,hex(b),inet_ntoa(b) as ip from test;
+------------+----------+----------------+
| b          | hex(b)   | ip             |
+------------+----------+----------------+
| 3520061480 | D1CFE028 | 209.207.224.40 |
+------------+----------+----------------+
1 row in set (0.00 sec)

А сами данные, естесственно в le, ибо i686:
$ od -x < test.MYD 
0000000 28fd cfe0 00d1

ps:
- 209×2563 + 207×2562 + 224×256 + 40
+ 209×256^3 + 207×256^2 + 224×256 + 40

Chumka ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.