PHP SQL find™和其他特殊字符

时间:2015-03-03 12:37:20

标签: php mysql database special-characters

我有一个大的dB表,我需要搜索并替换某些char等。其中一些是特殊的char。

首先我尝试在将语句更改为Update replace type之前找到。

下面的

运行正常
$Search_for = '%apple%'; 

但是在特殊字符

上失败了

因此,对于这个例子,我们将专注于™(从现场粘贴)

$search_what = 'LongDescription';
$Search_for = '%™%';
SearchToSee($conn,$search_what,$Search_for);

和功能

function SearchToSee ($conn,$search_what,$Search_for) {
                $stmt = $conn->prepare(" SELECT *  FROM table_name WHERE $search_what Like  '$Search_for'  ");
                $stmt->execute();

               foreach ( $stmt as $row ) {
                            print_r ($row);
                }

那么如何格式化$Search_for =

由于进一步的原因和其他系统我必须运行每个发现不同的替换char并用自己的不同字母替换。

到目前为止,我已经尝试过:

PHP中的

myadmin WHERE LongDescription LIKE'%™%'有效!!

在php中:

$Search_for = '%apple%';  works but not special char
$Search_for = '%™%';// Not Working
$Search_for = '%_™%';// Not Working
$Search_for = '™';// Not Working
$Search_for = '%™%';// Not Working

我是否需要更改编码以传递给SQL?

现在尝试了:

        $Search_for2 = '™';
        $Search_for3 = mb_convert_encoding($Search_for2, 'UTF-8', 'UTF-8'); 
        echo  $Search_for3;
        $Search_for = '%'.$Search_for3.'%';

哪个回声•和适用于像“APPLE”这样的合适术语,但仍然不是特殊字符。

3 个答案:

答案 0 :(得分:1)

首先关闭,您是部分正确的。对Mysql的编码必须正确。但我想这不是你的问题,因为PHP为你设置了这个IIRC。只需执行select '™';,看看您是否在PHP中获得了正确的反馈。如果没有,请检查您的编码设置。

但其次我怀疑问题存在,是您使用的排序规则。根据排序规则,在处理字符串时,特殊字符将被忽略或被视为其他字符。

排序设置在客户端,因此可能是默认的PHP排序规则与phpMyAdmin设置的不同,导致您看到的不同行为。

select * from
  (select 'privé' as word) as t
where word like '%e%'

根据使用的归类,上述将会或不会命中。

但下面肯定不会打到:

select * from
  (select 'privé' COLLATE utf8_bin as word) as t
where word like '%e%' COLLATE utf8_bin;

但下一次肯定会打到:

select * from
  (select 'privé' COLLATE utf8_general_ci as word) as t
where word like '%e%' COLLATE utf8_general_ci;

尝试使用以下命令检查PHP和phpMyAdmin中的排序规则和字符集:

select
  @@collation_server,
  @@collation_connection,
  @@character_set_server,
  @@character_set_client;

我可以提供的第三个建议是检查您是否确实存储并搜索完全相同的字符。如果我在PHP中echo ord('™');,我会得到226。可能是您搜索的存储值和值具有不同的序数值?我不确定这是可能的,但是你可能正在使用具有不同序数值的相同字符的不同编码?

答案 1 :(得分:0)

mysqli_set_charset('utf8') - 或相关功能。

您显示的字符串片段意味着您有“双重编码”。

执行SELECT HEX(col), col FROM tbl WHERE ...以查看为™存储的内容。如果它以utf8正确存储,你应该看到e284a2,当显示为latin1时,显示“┢“。如果它是双重编码,那么你将获得十六进制'C3A2E2809EC2A2'或'â'¢';

一旦我们确定数据是否正确存储,我们就可以专注于INSERT与SELECT中需要修复的内容。可能它在PHP代码中。

有关该问题的更多讨论,请参阅http://mysql.rjweb.org/doc.php/charcoll

修改...

好的,我看到你有空间(20),TM(99),空格(20)的latin1编码。

计划A:一切都应该正常工作:如果列是CHARACTER SET latin1并且您在PHP中使用了set_charset('utf8'),那么事情应该“正常工作”。这是因为该组合应该将latin1 x99转换为/从utf8 xE284A2转换。假设是错误的吗?

计划B:在PHP设置,html元等中切换到latin1

计划C:修复表中的数据(可能只留下PHP)。这可能涉及ALTER转换表。列当前是否定义为CHARACTER SET latin1? (Do SHOW CREATE TABLE。)

计划D:重新开始。 (这涉及丢弃表格,重新创建它们,重新填充它们等等 - 如果您刚刚开始使用数据库,这可能是实用的。)

(没有“双重编码”。)

答案 2 :(得分:0)

感谢Rick和Nl-X 事实证明,在

    <?php require_once(' dB connection.... 

是PDO,它不允许更改编码。

所以解决方案添加

     $conn2=mysqli_connect($servername,$username,$password,.......

$search_what =  'Table_Name';
$Search_for2 = '™';
$Search_for = '%'.$Search_for2.'%';
$Replace_with = 'TRADE MARK';

SearchToSee($conn2,$search_what,$Search_for,$Replace_with,$Search_for2);

和功能

function SearchToSee ($conn2,$search_what,$Search_for,$Replace_with,$Search_for2) {
mysqli_set_charset($conn2, 'utf8'); // change as required
mysqli_query($conn2, "SET NAMES 'utf8';");// change as required
mysqli_query($conn2, "SET CHARACTER SET 'utf8';");// change as required
mysqli_query($conn2, "SET COLLATION_CONNECTION = 'utf8_unicode_ci';"); // change as required

// below makes it simple to see what your changing

$result = mysqli_query($conn2, "SELECT *  FROM $table WHERE $search_what     Like '$Search_for'");
$result2 = mysqli_query($conn2, "select
  @@collation_server,
  @@collation_connection,
  @@character_set_server,
  @@character_set_client;");

  foreach ($result2 as $grr) {
                echo '<br>';
                print_r ($grr);// shows result of new settings need to match last line
                echo '<br>Array ( [@@collation_server] => latin1_swedish_ci [@@collation_connection] => latin1_swedish_ci [@@character_set_server] => latin1 [@@character_set_client] => latin1 ) '; // original N/W $grr
            echo '<br>latin1_swedish_ci  ----              utf8_general_ci  ----       latin1      ----- utf8 <br><br>'; // from @@ checks in phpmyadmin on table.
            }

// TO Update
mysqli_query($conn2, "UPDATE Table_Name SET $search_what = replace($search_what, '$Search_for2', '$Replace_with') WHERE $search_what Like '$Search_for'");              
}

希望能有所帮助。