Як уникнути одинарних лапок в MySQL


98

Як вставити значення в MySQL, які складаються з одиничних або подвійних лапок. тобто

This is Ashok's Pen.

Єдина цитата створить проблеми. Можуть бути й інші символи втечі.

Як правильно вставити дані?


Відповіді:


126

Простіше кажучи:

SELECT 'This is Ashok''s Pen.';

Тому всередині рядка замініть кожну цитату на дві.

Або:

SELECT 'This is Ashok\'s Pen.'

Уникнути =)


9
Ви можете оновити свою публікацію, щоб включити mysql_real_escape_string () або додавання () в якості можливих рішень ..., як в одному з коментарів нижче, ОП заявляє, що вони просто читають з файлу та вставляють.
Джеймс Б

3
Методи mysql_ * не рекомендуються для подальшого використання, оскільки вони застаріли .
hd1

Це правильна відповідь, хоча в наші дні найкращим варіантом є використання одного з
Райана

10

'- характер втечі. Отже, ваш рядок повинен бути:

Це Перо Ашока

Якщо ви використовуєте якийсь фронтальний код, вам потрібно зробити заміну рядка, перш ніж надсилати дані в збережену процедуру.

Наприклад, в C # ви можете зробити

value = value.Replace("'", "''");

а потім передати значення збереженій процедурі.


Я не вставляю дані вручну, витягую їх з Файлу, і з’являться ваклуни: ручка Ашока. Як його вставити. створив процедуру для цього .. як зробити це правильно.
Ашок Гупта

FWIW мінорна нітка: зворотна косої риси є "символом втечі"; ''(дві одиничні лапки) - спеціальна альтернатива, дозволена для "уникнення" символу з однією цитатою.
ToolmakerSteve

9

Дивіться мою відповідь на тему "Як уникнути символів у MySQL"

Яку би бібліотеку ви не використовували для розмови з MySQL, буде вбудована функція уникнення, наприклад, в PHP ви можете використовувати mysqli_real_escape_string або PDO :: цитата


1
Я не вставляю дані вручну, витягую їх з Файлу, і будуть значення: перо Ашока. Як його вставити. створив процедуру для цього .. як зробити це правильно.
Ашок Гупта

Просто примітка This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

7

Якщо ви використовуєте підготовлені оператори, драйвер оброблятиме будь-які втечі. Наприклад (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

Використовуйте цей код:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

Це вирішить вашу проблему, оскільки база даних не може виявити спеціальні символи рядка.


1
Просто примітка This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee

6

Є ще один спосіб зробити це, який може бути, а може бути і не безпечнішим, залежно від вашої точки зору. Він вимагає MySQL 5.6 або новішої версії через використання конкретної рядкової функції:FROM_BASE64 .

Скажімо, у вас є це повідомлення, яке ви хочете вставити:

"Ах," майже головий Нік махнув елегантною рукою, - справа не важлива ... Це не так, ніби я дуже хотів приєднатися ... Думав, я подав би заявку, але, мабуть, я не виконую вимог '- "

Ця цитата має купу одно- та подвійних лапок, і було б справжнім болем вставити в MySQL. Якщо ви вставляєте це з програми, легко уникнути цитат тощо. Але, якщо вам доведеться помістити це в сценарій SQL, вам доведеться відредагувати текст (щоб уникнути цитат), який може бути схильним до помилок або чутливий до перекладу слів тощо.

Замість цього ви можете Base64-кодувати текст, так що у вас є "чистий" рядок:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Деякі зауваження про кодування Base64:

  1. Base64-кодування - це двійкове кодування , тож краще переконайтесь, що ви правильно встановили набір символів під час кодування, тому що MySQL буде декодувати рядок, кодований Base64, у байти, а потім інтерпретувати їх. Бути впевненимbase64 і MySQL погодиться, що таке кодування символів (рекомендую UTF-8).
  2. Я завернув рядок до 50 стовпців для читабельності на переповнення стека. Ви можете прикріпити його до будь-якої кількості стовпців, які ви хочете (або взагалі не перегорнути), і вона все одно працюватиме.

Тепер, щоб завантажити це в MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Це буде вставлено без будь-яких скарг, і вам не доведеться вручну уникати жодного тексту всередині рядка.


5

Вам слід уникати спеціальних символів, використовуючи цей \символ.

This is Ashok's Pen.

Стає:

This is Ashok\'s Pen.

3

Якщо ви хочете зберігати (') апостроф у базі даних, використовуйте цей код нижче

$new_value = str_replace("'","\'", $value); 

$ new_value може зберігатись у базі даних.


3

Ви можете використовувати цей код,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

якщо mysqli_real_escape_string () не працює.


3

У PHP використовуйте mysqli_real_escape_string .

Приклад з посібника з PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>



0

Для програмного доступу ви можете використовувати заповнювачі, щоб автоматично уникати небезпечних символів для вас.

Наприклад, у Perl DBI ви можете використовувати:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

Використовуйте або addlahes (), або mysql_real_escape_string ().


Просто примітка This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee


Краще буде оновити свою відповідь (наприклад, коментарі можуть зникнути в будь-який час).
Пітер Мортенсен

0

Як я це роблю, використовуючи Delphi:

Постановка "втечі":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Рішення:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Результат:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Ця функція замінить усі Char (39) на "\" ", що дозволяє вставляти або оновлювати текстові поля в MySQL без проблем.

Подібні функції є у ​​всіх мовах програмування!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.