Mycat2 icon indicating copy to clipboard operation
Mycat2 copied to clipboard

mycat2是否支持text类型的字段

Open zhouweixing123 opened this issue 3 years ago • 4 comments

您好,麻烦问一下mycat2是否支持text类型的字段呢,目前遇到一个问题是有一个文章表里面的content字段的类型是longtext的,直接查询数据数据是没有问题,但是通过laravel8框架查询返回的数据是"3c7020636c6173733d224d736f4e6f726d616c223e3c7370616e207374796c653d226d736f2d737061636572756e3a2027796573273b20666f6e742d66616d696c793a20e5ae8be4bd933b20666f6e742d73697a653a2031302e3530303070743b206d736f2d666f6e742d6b65726e696e673a20312e3030303070743b223e3c7370616e207374796c653d22666f6e742d66616d696c793a20e5ae8be4bd933b223ee5889de4b880efbc8ce79785e88085e4b89ce58d97e8b7af3c2f7370616e3e203c7370616e207374796c653d22666f6e742d66616d696c793a20e5ae8be4bd933b223ee7a59ee4bdbfe5aea2e9acbcefbc8ce5819ae5b487e5a4b4e79785efbc8ce697b6e5af92e783adefbc8ce8b5b7e59d90e4b88de5ae89efbc8ce697a0e58a9befbc8ce9a5ade9a39fe697a0e591b3efbc8ce794a8e799bde992b1e4ba94e5bca0efbc8ce4b89ce58d97e59b9be58d81e6ada5e98081e4b98be380823c2f7370616e3e3c2f7370616e3e3c2f703e0a3c7020636c6173733d224d736f4e6f726d616c223e3c7370616e207374796c653d226d736f2d737061636572756e3a2027796573273b20666f6e742d66616d696c793a20e5ae8be4bd933b20666f6e742d73697a653a2031302e3530303070743b206d736f2d666f6e742d6b65726e696e673a2031"这样的,但是原始数据应该是"<p>张三</p>"这样的。但是将字段类型改成varchar类型后接收到的数据就没有问题了。请问有没有这种问题的解决方案呢?

zhouweixing123 avatar Nov 08 '22 08:11 zhouweixing123

这个问题我也遇到了,你的解决了没?

TopPGF avatar May 11 '24 06:05 TopPGF

这个问题我也遇到过,你解决了吗? 没有,这后来用的是varchar类型的

zhouweixing123 avatar May 11 '24 07:05 zhouweixing123

找了官方文档,mycat2对于BLOB处理相关 1.mycat2对longdata报文直接识别为byte[],不再进行转换处理 2.对于prepare statement execute报文中的FIELD_TYPE_VARCHAR,会先使用utf8编码尝试进行转换,然后不是utf8编码,则当做byte[]处理

php把byte[]转成了十六进制的字符串,正常处理就行了

$hexString = '3130613ce5beb0'; // 假设这是“10a<彭”的 UTF-8 编码的十六进制表示 // 通常我们需要知道每个字符的十六进制编码的长度,但在这个例子中,我们假设每两个字符代表一个字节 $hexCharsPerByte = 2; $bytes = []; for ($i = 0; $i < strlen($hexString); $i += $hexCharsPerByte) { $byte = substr($hexString, $i, $hexCharsPerByte); $bytes[] = hexdec($byte); // 将每两个字符的十六进制转换为十进制(即一个字节) } print_r($bytes); // 使用 pack 函数将字节数组组合成字符串 $utf8String = pack('C*', ...$bytes); echo $utf8String; // 输出:“10a<彭”

TopPGF avatar May 11 '24 07:05 TopPGF

找了官方文档,mycat2对于BLOB处理相关 1.mycat2对longdata报文直接识别为byte[],不再进行转换处理 2.对于prepare statement execute报文中的FIELD_TYPE_VARCHAR,会先使用utf8编码尝试进行转换,然后不是utf8编码,则当做byte[]处理

php把byte[]转成了十六进制的字符串,正常处理就行了

$hexString = '3130613ce5beb0'; // 假设这是“10a<彭”的 UTF-8 编码的十六进制表示 // 通常我们需要知道每个字符的十六进制编码的长度,但在这个例子中,我们假设每两个字符代表一个字节 $hexCharsPerByte = 2; $bytes = []; for ($i = 0; $i < strlen($hexString); $i += $hexCharsPerByte) { $byte = substr($hexString, $i, $hexCharsPerByte); $bytes[] = hexdec($byte); // 将每两个字符的十六进制转换为十进制(即一个字节) } print_r($bytes); // 使用 pack 函数将字节数组组合成字符串 $utf8String = pack('C*', ...$bytes); echo $utf8String; // 输出:“10a<彭”

对,这个当时我看了他的源码,想改来着,但是mycat这个属实不知到怎么改,后来就没再管这个事了

zhouweixing123 avatar May 11 '24 08:05 zhouweixing123