Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP SQL查找™ 和其他特殊字符_Php_Mysql_Database_Special Characters - Fatal编程技术网

PHP SQL查找™ 和其他特殊字符

PHP SQL查找™ 和其他特殊字符,php,mysql,database,special-characters,Php,Mysql,Database,Special Characters,我有一个很大的数据库表,我需要在其中搜索和替换某些字符等。其中一些是特殊字符 首先,我尝试在将语句更改为Update replace type之前查找 下面是正常的 $Search_for = '%apple%'; 但在特殊字符上失败 因此,对于这个示例,我们将集中讨论™ 从现场粘贴的 $search_what = 'LongDescription'; $Search_for = '%™%'; SearchToSee($conn,$search_what,$Search_for); 以及

我有一个很大的数据库表,我需要在其中搜索和替换某些字符等。其中一些是特殊字符

首先,我尝试在将语句更改为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);
                }
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'");              
}
那么如何格式化$Search_for=

由于其他系统的原因,我必须以不同的方式运行每个find replace char,并用它自己的不同字母替换

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

在PHP myadmin中,其中LongDescription类似于'%™%' 工作

在php中:

$Search_for = '%apple%';  works but not special char
$Search_for = '%™%';// Not Working
$Search_for = '%_™%';// Not Working
$Search_for = '&trade;';// 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.'%';
哪一个echo是正确的,适用于像APPLE这样的恰当术语,但仍然不是特殊字符。

首先,你部分正确。对Mysql的编码必须正确。但我想这不是你的问题,因为PHP为你设置了IIRC。只要做一个选择'™'; 并查看您是否在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中,我得到226。您的存储值和您搜索的值是否具有不同的序号值?我不确定这是否可行,但可能您正在使用不同的编码,这些编码具有相同的字符和不同的序数值?

mysqli\u set\u charset'utf8'-或相关函数

您显示的字符串片段暗示您使用了双重编码

请选择HEXcol,tbl中的col,其中。。。查看存储的目的™. 如果它以utf8的形式正确地存储在中,您应该会看到e284a2,当它以latin1的形式显示时,会显示–2。如果它是双重编码的,那么您将得到十六进制'C3A2E2809EC2A2'或'螨ž¨ž¨ž

一旦确定数据是否正确存储,我们就可以将重点放在INSERT和SELECT中需要解决的问题上。可能是在PHP代码中

有关此问题的更多讨论,请参阅

编辑

好的,我看到你有space20,TM99,space20的拉丁文编码

计划A:一切都应该正常工作:如果列是字符集latin1,并且您在PHP中使用了SET_charset'utf8',那么一切都应该正常工作。这是因为该组合应已将latin1 x99转换为utf8 xE284A2。假设是错误的吗

方案B:在PHP设置、html元数据等中切换到latin1

方案C:修复表中的数据,可能不使用PHP。这可能涉及转换表的ALTER。列当前是否定义为字符集1?显示创建表

计划D:重新开始。这涉及到删除表、重新创建表、重新填充表等等——如果您刚刚开始使用数据库,这可能很实用

没有双重编码。

多亏了Rick和Nl-X 结果是在

    <?php require_once(' dB connection.... 
以及功能

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);
                }
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'");              
}

希望这对某人有帮助。

是的,你需要。。。这取决于数据库使用的编码方式。。如果是UTF8,则需要将字符串转换为UTF8。。请参阅:Thank-db显示长描述文本utf8\u general\u ci和$Search\u for 2='2!'™'; $Search_for3=mb_convert_编码$Search_for2,'UTF-8','UTF-8';echo$Search_搜索3;echo显示为¨¨$Search_for='%'。$Search_for 3'%';找不到任何-Ideas?请尝试从mb_convert_编码中删除最后一个参数。。正如您所说,输入是UTF-8。。如果不是,请使用默认的内部编码,您可能会获得更大的成功..谢谢-更改为$Search_for3=mb_convert_encoding$Search_for2,'UTF-8';echo现在显示了Ã、但仍然没有找到特殊字符可能在字符串上执行正则表达式并只保留空格,az a-Z 0-9?Hi-PHPmyadmin选择十六进制LongDescription,LongDescription从表格中选择LongDescription,其中LongDescription类似'%™%' --- 将209920显示为十六进制。。只为™ 在进一步调查数据库的字段中,表是拉丁文的@排序规则@服务器@排序规则@连接@字符集@服务器@字符集@客户端拉丁文的@瑞典文的@ci utf8@通用的@ci拉丁文1utf8@Fred您应该执行选择@排序规则
n\u服务器@排序规则\u连接@字符集\u服务器@字符集\u客户端;从PHP和PhpMyAdmin,并检查它们是否返回相同的响应!我猜你的客户端设置不一样。一旦您知道需要什么字符集/排序规则,请查看下面的答案,了解如何设置正确的字符集/排序规则:Hi-PHPmyadmin SELECT HEX LongDescription,LongDescription FROM table WHERE LongDescription,如'%™%' --- 将209920显示为十六进制。。只为™ 在进一步调查数据库的字段中,表是拉丁语的@排序规则@服务器@排序规则@连接@字符集@服务器@字符集@客户端拉丁语的@瑞典语的@ci utf8@通用的@ci拉丁语utf8Hi Rick-谢谢,我终于解决了它。。。数据库到处都是,每天都从我无法控制的来源继承/更新,所以我无法更改它。php中的编码设置不起作用,因为继承的dB连接再次不是我的ARGG was PDO为该函数添加了第二个$conn2 mysqli,现在可以在两个方向上设置编码。