Як уникнути одинарних лапок в 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.